android内存泄露优化总结

Android方面的内存泄露主要有一下几方面的情况造成的

1 数据库的cursor没有关闭

操作Sqlite数据库时,Cursor是数据表中每一行的集合。Cursor提供了很多方法,可以很方便的读取数据库中的值,可以很方便地读取数据库中的值。

可以根据索引,列名等获取数据库中的值,通过游标的方式可以调用moveToNext()移到下一行。

当我们操作数据库后,一定要记得调用Cursor对象的close来关闭游标,释放资源。

2 构造adapter没有使用缓冲contentview

在继承BASEAdapter时会让我们重写getView(int position,View convertView,ViewGroup parent)方法,第二个参数convertView就是我们要用到的重用的对象。

public View getView(int position,View convertView,ViewGroup parent){

ViewHolder vHolder=null;

if(convertView==null){  //如果convertView对象为空则创建对象,不为空则复用。

convertView=inflater.inflate();

vHolder=new ViewHolder();

vHolder.img=(ImageView)convertView.findviewbyid()

vHolder.tv=(ImageView)convertView.findviewbyid()

convertView.setTag(vHolder);

}else{

vHolder=(ViewHolder)convertView.getTag();

}

vHolder.img.setImageBitmap();

vHolder.tv.setText();

return convertView;}

static class ViewHolder{

TextView  TV;

ImageView  img;

}

3 调用registerReceiver()后未调用unregisterReceiver()

广播接受者BroadcastReceiver经常在应用中用到,可以在多线程任务完成后发送广播通知UI更新。也可以系统广播实现一些功能。

IntentFilter intentFilter=new IntentFilter();

intentFilter.addAction()

this.registerReceiver(receiver,intentFilter)

使用完后一定在activity的生命周期内用unregisterReceiver()方法取消注册。通常在activity的onDestroy()方法中重写。

4 没有关闭inputStream 和OutputStream

5 Bitmap使用后没有调用recycle()

图片处理不好是造成内存溢出的一个头号原因。

但我们处理完图片之后可以通过recycle()方法来回收图片对象。

if(!bitmap.recycle()){bitmap.recycle()}

除此之外:

直接使用ImageView显示image会占用较多资源,特别是图片较大的时候,可能导致奔溃。

使用BitampFactory.Options设置inSampleSize,这样做就可以减小对系统资源的要求。

属性值为原始图片大小的1/2,那么就是原始大小的1/4.

BitmapFactory.Options bitmapFactoryOptions=new BitmapFactory.Options()

bitmapFactoryOptions.inJustDecodeBounds=true;

bitmapFactoryOptions.inSampleSIZE=2;

6 Context泄露   http://www.cnblogs.com/hun2014/articles/4704722.html

7 static关键字 

当类的成员变量声明为static后,它是属于类的而不是对象的,如果我们将很大的资源对象Bitmap Context等声明为static后,那么这些资源就不会随着对象的回收而回收,而一直存在。所以在使用static关键字定义成员变量的时候要慎重。

 

posted @ 2015-08-07 15:58  大大的海棠湾  阅读(154)  评论(0)    收藏  举报