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关键字定义成员变量的时候要慎重。

浙公网安备 33010602011771号