Android 加载打图片出现OOM异常的处理方式
来源:互联网 发布:局域网怎么ping网络 编辑:程序博客网 时间:2024/04/28 13:27
在很多的Android项目中都会出现加载网络图片或是加载本地SD卡中的图片导致应用出现OOM异常,应用挂死的现象。查了很多资料,终于对应用的OOM做出了一定程度的优化。故写出来大家都分享一下。
OOM(Out Of Memory )异常 ,顾名思义这个异常是说你的内存不够用或者耗尽了,在Android中,一个Process 只能使用16M内存,如果超过了这个限制就会跳出这个异常。这样就要求我们要时刻想着释放资源System.gc();值得注意的是Bitmap在不用时,一定要recycle,不然OOM是非常容易出现的。
查了很多资料,有说是强制增大应用的内存空间,有说是使用软引用及弱引用试得虚拟机更好更快的实现内存回收机制,全都用了,可OOM异常依然存在。这是为什么呢?
最后查看API源码才发现:
当使用 imageView.setBackgroundResource,imageView.setImageResource, 或者BitmapFactory.decodeResource 、BitmapFactory.decodeFile 这样的方法来设置一张大图片的时候,这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。
因此,改用先通过BitmapFactory.decodeStream方法解流的方式,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常。
另外,需要特别注意: decodeStream是直接读取图片资料的字节码了, 不会根据机器的各种分辨率来自动适应,使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了。
此处提供几种图片设置的方式:
1.得到资源文件中的图片bitmap
/** * 得到资源文件中的图片bitmap * @param context * @param resId * @return Bitmap */ public static Bitmap readBitMap(Context context, int resId){ BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = context.getResources().openRawResource(resId);Bitmap bm = BitmapFactory.decodeStream(is,null,opt);return bm; }
2. 通过DecodeFile解析SD卡中的图片
/** * 通过DecodeFile解析SD卡中的图片 * @param file * @return Bitmap */public static Bitmap getBitmapByDecodeFile(File file){Bitmap newBit = null; try { FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); Bitmap bitmap= BitmapFactory.decodeStream(bis); newBit = Bitmap.createScaledBitmap(bitmap, 180, 180, false); bis.close(); fis.close(); } catch (Exception e) { e.printStackTrace(); } return newBit;}3.在设置imageView的background的时候没有setImageBitmap(bitmap)方法,但是有img.setBackgroundDrawable(bitmapDrawale)方法
故我们还需要通过得到的bitmap在去获取他的bitmapDrawable
BitmapDrawable bmdrawable = new BitmapDrawable(context.getResources(), bitmap);
最后得到了bitmap后就可以通过img.setImageBitmap(bitmap)或者是img.setBackgroundDrawable(bitmapDrawale)将图片设置到imageView中去。
至此,应用中出现的OOM异常就基本解决。
- Android 加载打图片出现OOM异常的处理方式
- ANDROID图片加载时出现OOM的一般处理方法
- Android在处理图片减少出现OOM的方式
- Android在处理图片减少出现OOM的方式
- Android在处理图片减少出现OOM的方式
- Android在处理图片减少出现OOM的方式
- Android在处理图片减少出现OOM的方式
- android 加载图片防止oom的处理
- android 加载图片oom异常
- android加载图片出现OOM
- 加载大图片时,出现的OOM异常,以及处理OOM异常的方法
- 基础知识记录:OOM异常出现的情况与处理方式
- Android加载图片时出现OOM(OutOfMermary)的问题解决方案
- Android 解决加载图片过多出现oom--强大的Fresco
- Android加载一张3.4MB的图片,不出现OOM
- android中加载图片时出现oom
- Android避免加载图片出现OOM
- 加载图片出现OOM
- 如何构造组件?
- 和大神们学习每天一题(leetcode)-Sort Colors
- 关于 必须声明标量变量 "@pk_branch"
- 【伯乐在线】跑步时身体在前30分钟的神奇体验
- Git的深入理解与GitHub托管服务的使用
- Android 加载打图片出现OOM异常的处理方式
- 人见人爱A-B
- CSS3 会跳舞的三角形
- Android自定义控件:老版优酷的三级菜单(效果图 + Demo)
- hdu 5000 Clone
- C语言的那些小秘密之断言
- 检测直线(Line)并按倾斜角度进行校正、画线、画延长线
- Makefile 中:= ?= += =的区别
- A20 android 移植MT7601u