您的位置:首页 > 移动开发 > Android开发

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

2015-09-16 16:37 351 查看
一、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.自定义堆内存大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: