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.自定义堆内存大小
要解决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.自定义堆内存大小
相关文章推荐
- Android:动画系统
- Android清除本地数据缓存
- Android:都是Layout的BaselineAligned惹的祸
- android .9图片的制作
- android 内部缓存器(手机自带的存储空间中的当前包文件的路径)
- onActivityResult(),startActivityForResult()的使用
- Android 通知栏
- Android学习笔记之——ListView 的两种适配器ArrayAdapter和SimpleAdapter
- Android开发中那些你不知道的事
- Android学习笔记之——DatePicker&TimePicker
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android Canvas Layers
- Retrofit – Java(Android) 的REST 接口封装类库
- Android 开发总结
- android模拟器的判定
- Android开发学习笔记:浅谈显示Intent和隐式Intent
- Java-->Android 直连 Ms Sql Server 2008数据库
- Android:res之selector背景选择器
- NDK基本开发及适用场景
- fir.im Weekly - 600个 Android 开源项目汇总