TextVersion_05_OOM异常

来源:互联网 发布:上饶网络教育报名时间 编辑:程序博客网 时间:2024/04/30 05:08


OOM异常

OOM异常(Out Of Memory Error)

 

哪些情况会导致OOM异常

 


1.图片过大

 

Android中用bitmap很容易内存溢出,

比如报这个错: java.lang.OutOfMemoryError:bitmap size exceeds VM budget.

 

解决1: 等比例缩小图片

 

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 2;

//Options 只保存图片尺寸大小,不保存图片到内存

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inSampleSize = 2;

Bitmap bmp = null;

bmp = BitmapFactory.decodeResource(getResources(),mImageIds[position],opts);

//回收

bmp.recycle();

 

以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。

 

解决2: 对图片采用软引用,及时进行recycle()操作

 

SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(pBitmap);

if(bitmap != null){

if(bitmap.get() != null && !bitmap.get().isRecycled()){

bitmap.get().recycle();

bitmap = null;

}

}

 

 

2.界面切换导致OOM

 

有时候我们会发现这样的问题,横竖屏切换 N 次后OOM了。

这种问题没有固定的解决方法,但是我们可以从以下几个方面下手分析。

 

1.看看页面布局中有没有大图片

 

去除 xml 中相关设置,改在程序中设置背景图(放在onCreate()方法中):

Drawable drawable = getResources().getDrawable(R.drawable.id);

ImageView imageView = new ImageView(this);

imageView.setBackgroundDrawable(drawable);

Activity destory 时注意,

drawable.setCallback(null); 防止 Activity得不到及时的释放。

 

2.跟上面相似,直接把xml配置文件加载成view再放到一个容器里

 

然后直接调用

this.setContentView(View view);方法

避免xml的重复加载

 

3.在页面切换时尽可能少地重复使用代码

 

比如:

重复调用数据库,

重复使用某些对象

 

 

 

 

3.查询数据库没有关闭游标

 

应用中经常进行查询数据库操作,

但是经常会使用完Cursor游标没有关闭

如果查询结果集比较小,内存消耗就不容易被发现

但是常时间大量操作的话就会内存溢出

 

 

4.构造Adapter,没有使用缓存的convertView

在使用Adapter的时候,尽可能使用convertView

 

 

 

5.Bitmap对象不再使用时要调用recycle()释放内存

 

有时需要手动操作Bitmap对象,如果一个Bitmap对象比较占内存

那么就要调用recycle()释放内存

 

 

6.其他情况

 

Android应用中最典型的需要释放内存的情况

就是在Activity的生命周期中

onPause(),onStop(),onDestroy()这几个方法中

都要看情况释放一些资源

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击