Android 图片加载Bitmap OOM错误解决办法
Android加载资源图片时,很容易出现OOM的错误。
因为Android系统对内存有一个限制,如果超出该限制,就会出现OOM。为了避免这个问题,需要在加载资源时尽量考虑如何节约内存,尽快释放资源等等。
Android系统版本对图片加载,回收的影响:
1,在Android 2.3以及之后,采用的是并发回收机制,避免在回收内存时的卡顿现象。
2,在Android 2.3.3(API Level 10)以及之前,Bitmap的backing pixel 数据存储在native memory, 与Bitmap本身是分开的,Bitmap本身存储在dalvik heap 中。导致其pixel数据不能判断是否还需要使用,不能及时释放,容易引起OOM错误。 从Android 3.0(API 11)开始,pixel数据与Bitmap一起存储在Dalvik heap中。
在加载图片资源时,可采用以下一些方法来避免OOM的问题:
1,在Android 2.3.3以及之前,建议使用Bitmap.recycle()方法,及时释放资源。
2,在Android 3.0开始,可设置BitmapFactory.options.inBitmap值,(从缓存中获取)达到重用Bitmap的目的。如果设置,则inPreferredConfig属性值会被重用的Bitmap该属性值覆盖。
3,通过设置Options.inPreferredConfig值来降低内存消耗:
默认为ARGB_8888: 每个像素4字节. 共32位。
Alpha_8: 只保存透明度,共8位,1字节。
ARGB_4444: 共16位,2字节。
RGB_565:共16位,2字节。
如果不需要透明度,可把默认值ARGB_8888改为RGB_565,节约一半内存。
4,通过设置Options.inSampleSize 对大图片进行压缩,可先设置Options.inJustDecodeBounds,获取Bitmap的外围数据,宽和高等。然后计算压缩比例,进行压缩。
5,设置Options.inPurgeable和inInputShareable:让系统能及时回收内存。
inPurgeable:设置为True,则使用BitmapFactory创建的Bitmap用于存储Pixel的内存空间,在系统内存不足时可以被回收,当应用需要再次访问该Bitmap的Pixel时,系统会再次调用BitmapFactory 的decode方法重新生成Bitmap的Pixel数组。
设置为False时,表示不能被回收。
inInputShareable:设置是否深拷贝,与inPurgeable结合使用,inPurgeable为false时,该参数无意义。
True: share a reference to the input data(inputStream, array,etc) 。 False :a deep copy。
6,使用decodeStream代替其他decodeResource,setImageResource,setImageBitmap等方法来加载图片。
区别:
decodeStream直接读取图片字节码,调用nativeDecodeAsset/nativeDecodeStream来完成decode。无需使用Java空间的一些额外处理过程,节省dalvik内存。但是由于直接读取字节码,没有处理过程,因此不会根据机器的各种分辨率来自动适应,需要在hdpi,mdpi和ldpi中分别配置相应的图片资源,否则在不同分辨率机器上都是同样的大小(像素点数量),显示的实际大小不对。
decodeResource会在读取完图片数据后,根据机器的分辨率,进行图片的适配处理,导致增大了很多dalvik内存消耗。
decodeStream调用过程:
decodeStream(InputStream,Rect,Options) -> nativeDecodeAsset/nativeDecodeStream
decodeResource调用过程:即finishDecode之后,调用额外的Java层的createBitmap方法,消耗更多dalvik内存。
decodeResource(Resource,resId,Options) -> decodeResourceStream (设置Options的inDensity和inTargetDensity参数) -> decodeStream() (在完成Decode后,进行finishDecode操作)
finishDecode() -> Bitmap.createScaleBitmap()(根据inDensity和inTargetDensity计算scale) -> Bitmap.createBitmap()
以上方法的组合使用,合理避免OOM错误。
- 浏览: 133879 次
- 性别:
- 来自: 广州
文章分类
最新评论
发表评论
-
Android Intent.FLAG_NEW_TASK详解
2014-11-10 10:11 536ddd -
观察者模式Observer(对象行为型)
2014-11-07 16:55 6301.概述 一些面向对 ... -
Android线程间的通信
2014-11-06 18:05 471andriod提供了 Handler 和 Looper 来满 ... -
Android——WebView组件的使用详解
2014-11-06 15:33 722通过本专题的讲解可以了解到WebView组件的详细使用: ... -
Android 最火的快速开发框架XUtils
2014-10-28 14:22 751最近搜了一些框架供初学者学习,比较了一下XUtils是目前 ... -
Android 增量更新实例
2014-10-18 15:25 488http://blog.csdn.net/lan410 ... -
Android Lint简介
2014-10-12 13:38 485http://blog.csdn.net/hudashi/ ... -
Android 4.0以后代码混淆及签名
2014-09-23 18:35 465http://blog.csdn.net/moruna/art ... -
android 点击EditTextView不弹出输入法
2014-09-10 16:29 4169看一个manifest中Activity的配置,如果这个页面 ... -
Android Xutils 框架
2014-09-10 16:26 692xUtils简介 xUtils 包含了很多实用的and ... -
SpannableString的基本用法
2014-09-09 15:59 772以前一直好奇QQ的输入框里面是如何出现表情的,今天看了下这 ... -
Android多媒体分析(一)MediaScanner (android 缩略图的原理)
2014-09-06 16:56 900http://blog.csdn.net/zqiang_55/ ... -
Android最佳实践之:StrictMode介绍
2014-08-26 16:36 675第1页: 【IT168技术 】最新的Androi ... -
浅谈开源项目Android-Universal-Image-Loader(Part 3.1)
2014-08-26 13:35 691最近,在办离职手续,相对来说,比之前一年多忙碌的外包闲了许多 ... -
Android中的SystemClock类
2014-08-25 08:39 1226一、声明: public final ... -
基于微信api Android程序签名+代码混淆
2014-08-22 13:37 1358微信开放平台真是独特啊!!! 微信的ap调用确实别新浪微博, ... -
Bitmap.Config下的几个图片质量参数
2014-08-21 16:49 895转自:http://www.cnblogs.com/cod ... -
对对对
2014-08-19 15:57 493http://www.cnblogs.com/akira9 ... -
android 动态效果学习之旅
2014-08-19 10:17 733一.Android官网上training的这个实例项目 co ... -
Android 解决ListView 和 ScrollView 共存冲突的问题
2014-08-13 18:16 624ListView 与 ScrollView 同在一个界面用头 ...
相关推荐
安卓下显示图片经常遇到OOM问题,这里给出了常用解决方案
基本上解决了OOM问题 如果 方便可以直接引用BitmapManager类到 项目中使用 解决blog 地址http://www.cnblogs.com/liongname/articles/2345087.html
Android解决图片加载OOM与listview图片错位乱跳问题解决,开源的代码,里面有示例demo
android 图片加载优化 解决的OOM异常
有效控制了Android大图片、多图片加载的OOM异常。
android加载大图避免oom,博客http://blog.csdn.net/u012305710/article/details/51079676
解决Android加载图片出现的OOM问题
图片oom,解决方法 图片oom,完美deom
加载大图片到内存时如何防止 OOM的产生
Android高级应用源码-加载本地图片,绝对不会出现OOM.zip
SurfaceView加载动画 解决OOM问题 多少帧都没问题 不会卡顿 不会卡顿
在Android平台上面,应用程序OOM异常永远都是值得关注的问题。通常这一块也是程序这中的重点之一。这下我就如何解决OOM作一点简单的介绍。 首先,OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所...
Android-Universal-Image-Loader-master 很好用的多图片加载 也可以自己修改成单图片的 simple是例子 包括List Grid 以及类似qq多图片滑动的
android gridview 加载大量图片。无OOM。 程序运行默认加载SD卡内所有图片文件,这是我写了之后用在一款成熟app里面的。可用
android图片墙,解决oom 博客地址: http://blog.csdn.net/pangzaifei/article/details/37763753
Android 异步加载图片缓存优化能异步加载图片,并缓存到本地,采用一级缓存,二级缓存和本地缓存,避免oom异常。源码中有详细注释,资料中有jar包,可以直接复制到项目中使用。
ViewPager加载大量图片oom解决方案
android加载大量图片内存溢出的三种解决办法
安卓在加载大图的时候经常会出现oom的错误,给大家分享我的一些处理经验。