android OOM(out of memory)异常的处理

一、Android系统对图片进行加载处理时,内存的申请情况是根据图片的宽高来决定。
要解决OOM异常,需要对加载的大尺寸的图片进行缩放。


Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/a.jpg");
iv.setImageBitmap(bitmap);


当通过此方法加载大图片的时候,容易出现OOM(out of memory)异常。




二、Xutils加载图片


三、lazylist框架专门解决大图片加载oom异常


1.获取系统给该应用分配了多少可用内存 32
2.32/4 = 8M  作为参照物,拿出四分之一的内存来缓存图片
3.在每次做内存缓存的时候都检查一下内存,跟8对比,如果超过8的话直接移除内存 里的缓存
4.
在加载图片的时候,先从内存中去查找是否有缓存图片。如果有就直接返回。
通过imageview去加载图片,如果没有返回图片,则开启新线程加载图片。




一级缓存:内存缓存
二级缓存:文件缓存,也叫sd卡缓存
三级缓存:网络加载图片




四、
造成oom异常的主要原因就是内存被占用,导致无法运行程序。除了图片加载时会出现oom异常,如果程序中的Activity比较多,也会造成oom。
所以,可以将Activity使用fragment代替,或者降低引用级别。





OOM异常的原因和处理
原因:
加载的图片太多或图片过大时经常出现OOM问题
通常OOM都发生在需要用到大量内存的情况下(创建或解析Bitmap,分配特大的数组等)
在GridView或ListView中,数据量有5000,每一屏只显示20个元素,把可见的bitmap保存在内存中,那些不可见的,就释放掉,当元素滑动时,再去加载Bitmap
加载图片的优化:
1、始终从cache中去取Bitmap,如果取到Bitmap,就直接把这个Bitmap设置到ImageView上面。
        2、如果缓存中不存在,那么启动一个task去加载(可能从文件来,也可能从网络)。
        3、每一个ImageView上面都可能绑定一个task,所以,这个ImageView必须提供一个方法能得到与之相关联的task,为什么要这样做?
因为在给一个ImageView绑定task之前,必须要把原先的task取消。


内存溢出的问题:
1.在内存引用上做些处理,比如说使用软引用,强化引用,弱引用
2.可以在内存中加载图片的时候直接在内存中做处理,比如:边界的压缩
3.动态的回收内存
4.优化Dalvik虚拟机的堆内存的分配
5.自定义堆内存大小





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值