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.自定义堆内存大小





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章