oom处理


如何避免 OOM 异常

OOM 内存溢出,想要避免 OOM 异常首先我们要知道什么情况下会导致 OOM 异常。

1、图片过大导致 OOM


Android 中用 bitmap 时很容易内存溢出,比如报如下错误:Java.lang.OutOfMemoryError :bitmap size exceeds VM budget。

解决方法:

方法 1: 等比例缩小图
BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 2;//Options只保存图片尺寸大小,不保存图片到内存BitmapFactory.Optionsopts= new BitmapFactory.Options();opts.inSampleSize = 2;Bitmap bmp =null;bmp = BitmapFactory.decodeResource(getResources(),mImageIds[position],opts);//回收

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

方法 2:对图片采用软引用,及时地进行 recyle()操作
SoftReference<Bitmap>bitmap= new SoftReference<Bitmap>(pBitmap);if(bitmap !=null){if(bitmap.get() != null && !bitmap.get().isRecycled()){bitmap.get().recycle();bitmap =null;}} 3:使用加载图片框架处理图片,如专业处理加载图片的 ImageLoader 图片加载框架。还有我们学的 XUtils 的 BitMapUtils 来做处理。

2、界面切换导致 OOM


一般情况下,开发中都会禁止横屏的。因为如果是来回切换话,activity 的生命周期会重新销毁然后创建。有时候我们会发现这样的问题,横竖屏切换 N 次后 OOM 了。这种问题没有固定的解决方法,但是我们可以从以下几个方面下手分析。1、看看页面布局当中有没有大的图片,比如背景图之类的。去除 xml 中相关设置,改在程序中设置背景图(放在 onCreate()方法中):
Drawable drawable = getResources().getDrawable(R.drawable.id);ImageView imageView =newImageView(this);imageView.setBackgroundDrawable(drawable);在 Activity destory 时注意,drawable.setCallback(null); 防止 Activity 得不到及时的释放。2、跟上面方法相似,直接把 xml 配置文件加载成 view 再放到一个容器里,然后直接调用this.setContentView(View view);方法,避免 xml 的重复加载。3、 在页面切换时尽可能少地重复使用一些代码比如:重复调用数据库,反复使用某些对象等等......

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

程序中经常会进行查询数据库的操作,但是经常会有使用完毕 Cursor 后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会出现内存问题,这样就给以后的测试和问题排查带来风险和困难。

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

在使用ListView的时候通常会使用adapter,那么我们应该尽可能的使用converView

为什么要使用convertView?

当converView为空时,用setTag()方法为每个view 绑定一个存放控件的ViewHolder对象。当converView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位

5.BitMap对象不再使用时调用recycle()释放

有时我们会手工的操作BitMap对象,如果一个Bitmap对象比较占内存,当它不再被使用的时候,可以调用bitmap.recycle()方法进行回收此对象的像素所占用的内存,但这不是必须的,视情况而定
6.其他
android应用程序中最典型的需要注意释放资源的情况是在activity生命周期中,在onPause(),onStop(),onDestory()方法中需要适当的释放资源的情况。使用广播没有注销也会产生OOM



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值