`
fly_ever
  • 浏览: 149740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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错误。
                   

     
    
1
0
分享到:
评论
1 楼 seebetpro 2015-10-10  
讲的十分全面

相关推荐

    处理android bitmap oom

    安卓在加载大图的时候经常会出现oom的错误,给大家分享我的一些处理经验。 这个是优化后的版本。

    处理android bitmap oom 2.0版本关闭了硬件加速

    安卓在加载大图的时候经常会出现oom的错误,给大家分享我的一些处理经验。这个版本关闭了硬件加速。

    处理android bitmap oom 2.0版本

    安卓在加载大图的时候经常会出现oom的错误,给大家分享我的一些处理经验。这是2.0版本。解决上个版本再次使用recycle bitmap的bug。

    Android App中使用Glide加载图片的教程

    与其他图片加载库相同,Glide除了可以加载网络图片之外,也可以加载本地图片。甚至还可以从各种各样奇葩的数据源中加载图片。 加载网络图片 很多情况下,我们使用图片加载库就是为了加载网络图片。网络操作是一个很...

    解决Android平台中应用程序OOM异常的方法

    怎么解决OOM,通常OOM都发生在需要用到大量内存的情况下(创建或解析Bitmap,分配特大的数组等),在这样的一种情况下,就可能出现OOM,据我现在了解到,多数OOM都是因为Bitmap太大。所以,这里我就专门针对如何解决...

    设计简单的Android图片加载框架

    目前Android 发展至今优秀的图片加载框架太多,例如: Volley ,Picasso,Imageloader,Glide等等。但是作为程序猿,懂得其中的实现原理还是相当重要的,只有懂得才能更好地使用。于是乎,今天我就简单设计一个网络...

    Android开发中Bitmap高效加载使用详解

    在Android开发中,我们经常与Bitmap打交道,而对Bitmap的不恰当的操作经常会导致OOM(Out of Memory)。这篇文章我们会介绍如何高效地在Android开发中使用Bitmap,在保证图片显示质量的前提下尽可能占用更小的内存。

    Afinal FinalBitmap 的使用

    使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题

    Android异步图片加载

    Android开发的童鞋们,你们还在为图片的异步加载烦心么?还在为处理Bitmap的OOM担心么?还在为辨析各种url闹心么?试试这段代码,无论它前缀是https、http还是其他的神马,轻松几步搞定

    Android加载图片内存溢出问题解决方法

    Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直接导致内存OOM,只有在BitmapFactory加载图片时使用BitmapFactory.Options对相关参数进行配置来减少加载的像素。 3. BitmapFactory.Opt

    浅析KJFrameForAndroid框架如何高效加载Bitmap

    我们在写Android程序的时候,肯定会用到很多图片。那么对于图片的压缩处理自然是必不可少。为什么要压缩?我想这个问题不必在强调了,每个人在最初学习Android的时候肯定都会知道这么一个原因:我们编写的应用程序都...

    afinal0.5.1框架 支持android下assets文件夹下图片加载

    4、FinalBitmap 支持任何view的图片加载,不在仅仅只是imageview(非imageView设置加载完成后设置其背景,用在常用语一些布局文件背景中) 5、FinalBtimap 支持加载本地图片,不仅仅只是网络图片 6、FinalBitmap ...

    android bitmap处理例子

    安卓在加载大图的时候经常会出现oom的错误,给大家分享我的一些处理经验。 大家可以参考android官网的例子bitmapfun,里面有很多地方可以借鉴 版本2.0 修改了大图模式下某些山寨机还会崩溃的bug

    Android性能优化之Bitmap图片优化详解

    前言 在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError – 内存溢出),...所以当加载图片的数量很多时,就很容易超过这个阀值,造成OOM。 2.

    Android高效加载大图、多图解决方案 有效避免程序OOM

    高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机...

    Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常

    Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常 1、高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们...

    Android 常用六大框架

    (4) 图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。 FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,...

    Android开发框架Afinal

    4、FinalBitmap模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,...

    afinal框架

    FinalBitmap模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载...

    android bitmap处理

    安卓在加载大图的时候经常会出现oom的错误,给大家分享我的一些处理经验。 大家可以参考android官网的例子bitmapfun,里面有很多地方可以借鉴。 之前的代码忘记了加上退出标记

Global site tag (gtag.js) - Google Analytics