`
fly_ever
  • 浏览: 153119 次
  • 性别: 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加载大图片OOM异常解决

    Android 加载大图片 OOM 异常解决方案 在 Android 开发中,加载大图片是一个常见的问题,这可能会引发 OOM(Out of Memory)异常。OOM 异常是指应用程序试图分配超过系统可用内存的内存空间,从而导致应用程序崩溃...

    Android加载网络图片与本地图片解决OOM问题

    "Android加载网络图片与本地图片解决OOM问题"这个主题旨在介绍如何有效地解决这些问题。 首先,我们需要理解为什么Android应用容易出现OOM。Android为每个应用程序分配了一定量的内存,当这个限制被超过时,系统会...

    bitmap OOM的解决方案

    在Android开发中,Bitmap对象是用于处理图像的重要类,但不当使用可能会引发“Out Of Memory”(OOM)错误。Bitmap OOM通常是由于加载过大或过多的图片资源导致内存溢出。以下是对这个问题的深入探讨和解决方案。 ...

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

    在Android开发中,Bitmap对象是用于处理图像的主要工具,但如果不妥善管理,它可能会引发一个常见的问题:Out of Memory(OOM)错误。特别是在处理大尺寸图片时,由于内存限制,系统可能无法分配足够的内存,从而...

    处理android bitmap oom

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是对于大型图像,加载到内存中会消耗大量资源。当应用无法...

    处理android bitmap oom 2.0版本

    在Android开发中,Bitmap对象是用于处理图像的重要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是当加载大图或大量图片时,容易超出可用内存限制。"处理...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    文档标题和描述中提到的“ANDROIDBITMAP内存限制OOM,OUTOFMEMORY”指的就是在处理位图(BITMAP)时超出了虚拟机(VM)的内存预算,导致系统抛出OutOfMemoryError异常。 根据给出的内容部分,我们可以推断出以下知识...

    Android相册图片解决OOM问题

    "Android相册图片解决OOM问题"这个主题,就是针对这一痛点进行探讨,主要涉及到以下几个关键知识点: 1. **内存泄漏**:内存泄漏是导致OOM的常见原因之一。当一个对象不再使用时,如果没有正确地释放,就会持续占用...

    android图片墙lrucache oom

    本篇文章将深入探讨如何使用LRUCache来解决Android图片墙中的OOM问题。 一、Android OOM简介 当应用程序请求的内存超过系统分配的最大内存时,就会发生OOM。在Android中,每个应用都有自己的Dalvik虚拟机实例,其...

    Android高级应用源码-加载本地图片,绝对不会出现OOM.zip

    "Android高级应用源码-加载本地图片,绝对不会出现OOM.zip"是一个针对这一问题的解决方案,它包含了如何在Android应用中加载本地图片而不引发内存溢出的示例代码。 首先,我们要理解为什么加载图片会引发OOM。在...

    Android OOM错误的原因

    - 使用计算好的`inSampleSize`再次加载图片,这样就可以得到一个尺寸适中的Bitmap对象,从而避免OOM错误的发生。 #### 五、总结 在Android开发中,理解和掌握OOM错误的产生原因是十分重要的。通过对内存管理机制的...

    android加载大图避免oom

    综上所述,避免Android加载大图导致的OOM问题,需要综合运用多种策略,包括图片尺寸适配、压缩、合理解码、利用第三方库、缓存策略以及关注内存管理。只有这样,才能确保应用的稳定性和用户体验。

    android gridview 加载大量图片。无OOM

    本篇文章将深入探讨如何在Android GridView中加载大量图片,同时避免出现OOM错误。 首先,理解OOM的原因至关重要。Android应用运行时内存是有限的,当应用占用的内存超过系统分配的最大值时,就会触发OOM。在加载...

    图片oom,解决方法

    总结来说,解决Android图片OOM问题,需要从图片的大小、加载策略、内存管理等多个方面进行优化。通过合理的图片处理方式和利用现有的优秀库,可以有效地避免和处理图片引起的内存溢出问题,提升应用性能和用户体验。

    安卓gif加载解决oom

    在Android开发中,由于系统对内存管理的特性,开发者时常会遇到Out Of Memory(OOM)问题,尤其是在处理大量图片资源时,比如在ListView或者RecyclerView中加载动态图GIF。本篇将详细介绍如何解决Android中加载GIF...

    android防止oom的图片加载例子

    在Android开发中,由于系统对每个应用程序分配的内存有限,特别是在...通过上述方法,我们可以有效地避免Android应用在加载大图时出现OOM错误。同时,结合内存管理和缓存策略,可以进一步提升应用的性能和用户体验。

    android 图片加载优化

    在Android开发中,图片加载是应用性能优化的关键环节,尤其对于内存管理而言,不恰当的图片处理可能导致Out Of Memory (OOM)异常,严重影响用户体验。针对这一问题,我们需要深入理解Android系统的内存机制,并学习...

    android 图片下载 防止OOM

    在Android开发中,图片加载是常见的操作,但如果不妥善处理,可能会导致内存溢出(Out Of Memory,简称OOM)问题,尤其是当应用需要加载大量或高分辨率图片时。本篇文章将详细探讨如何在Android中进行图片下载并防止...

    Android图片加载框架

    Glide的出现解决了Android原生Bitmap操作中的许多问题,如内存管理不当导致的OOM(OutOfMemory)错误,以及图片加载速度慢影响用户体验等问题。 Glide的核心功能包括: 1. **内存管理**:Glide采用了内存缓存策略...

    Demo_BitmapOOM_Solution.rar

    总的来说,这个解决方案旨在提供一套实用的方法,帮助开发者有效地管理和优化Bitmap资源,防止Android应用因Bitmap OOM问题而崩溃。通过理解Bitmap的内存管理机制,并结合示例代码进行实践,开发者可以提高应用的...

Global site tag (gtag.js) - Google Analytics