`
cppmule
  • 浏览: 446425 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

解決在 Android 中使用 Bitmap 造成 Out of memory 的方法

 
阅读更多

 


因为Android本身的限制,在2.x版中使用 Bitmap 只要遇到稍大一点的图,很容易就会遇到 out of memory 的状况,在经过一阵搜寻之后,一直没有很好的方法,有很多网站介绍的方法是把原图 subsample,但对于图片quality有要求的程序来说,这可是不被接受的解法,搞了半天,最后只好直接把 Android 的 source code 拿出来瞧瞧看看是否有什么机会解决这个问题,突然发现原来这个问题竟然有个投机取巧的解决方法。

 

目前在网站上找到的结果,效果最有效的是使用 

BitmapFactory.Options 

将里面的 inPurgeable 设定为 true,这样可以让java系统内存不足时先行回收部分的内存,这个方法其实已经解决大部分的问题了,不过生出来的内存还是算在java 的VM里总是有些美中不足。

在看了source code 之后,我发现在BitmapFactory.Options里竟然有一个inNativeAlloc的public变量,可以直接不把使用的内存算到VM里,有趣的是这个变量是个隐藏版的变量,所以在正常的SDK文件中看不到,用eclipse时也不会提示你,也不能直接用,因此我用了一些小技巧将这个变量设成true,如此一来bitmap out of memory的问题发生的机率又更低了,以下就是目前的程序代码,有需要的人可以参考一下,不过不管怎么样,bitmap这东西,只要不用了,还是请尽量将它recycle,不然再多内存也是不够用地~

 

public Bitmap decodeFile(String filePath){ 
	Bitmap bitmap = null; 
	BitmapFactory.Options options = new BitmapFactory.Options(); 
	options.inPurgeable = true; 
	try {
		BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options,true); 
	} catch (IllegalArgumentException e) { 
		e.printStackTrace(); 
	} catch (SecurityException e) { 
		e.printStackTrace(); 
	} catch (IllegalAccessException e) { 
		e.printStackTrace(); 
	} catch (NoSuchFieldException e) { 
		e.printStackTrace(); 
	} 
	if(mFilePath != null) { 
		bitmap = BitmapFactory.decodeFile(mFilePath, options); 
	} return bitmap;
} 
 
分享到:
评论

相关推荐

    android bitmap outOfMemory解决方法

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不正确管理,它可能导致应用程序运行时出现`OutOfMemoryError`。这是因为Bitmap占用大量的内存,尤其是当加载大尺寸或高分辨率图片时。这个问题在低内存...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

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

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    在Android开发中,我们经常会遇到内存管理的问题,特别是与Bitmap相关的内存溢出(Out Of Memory,简称OOM)问题。Bitmap对象是Android系统中用于处理图像数据的重要类,但由于其消耗大量的内存,不当使用可能导致...

    Android bitmap工具类

    - **Bitmap的尺寸调整**:通过`Bitmap.createScaledBitmap()`方法,根据需要调整Bitmap的尺寸,防止因图片过大导致OOM(Out Of Memory)错误。 - **Bitmap的缓存策略**:实现LRU(Least Recently Used)缓存,提高...

    Bitmap(3)-android中操作Bitmap

    由于Bitmap占用大量内存,不当管理可能导致OOM(Out Of Memory)异常。因此,我们需要合理使用`Bitmap.Config`来选择合适的图像格式(如ARGB_8888、RGB_565等),降低内存消耗。另外,使用`Bitmap.createBitmap()`...

    Android Bitmap 处理示例

    然而,由于Bitmap对象通常占用大量的内存,不当的处理可能导致内存溢出(Out Of Memory)问题,因此对Bitmap进行高效管理是至关重要的。本示例将详细介绍Android中Bitmap的处理,包括图片缓存策略和加载大图的技巧。...

    Android避免内存溢出(Out of Memory)方法汇总

    在Android开发中,内存管理是至关重要的,尤其是避免内存溢出(Out of Memory,简称OOM)。内存溢出会导致应用程序崩溃,影响用户体验。本篇文章将详细阐述如何在Android中有效地防止内存溢出,主要包括理解不同类型...

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

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

    处理android bitmap oom

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

    Android-OOM.rar_memory android_memory for Android_out

    在Android开发过程中,"Out Of Memory"(OOM)错误是一个常见的问题,特别是在处理大量数据、图像或者长时间运行的任务时。这个错误表示应用程序消耗了过多的内存,超过了系统分配的限制,导致系统无法再为该应用...

    处理android bitmap oom 2.0版本

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

    android bitmap通过byte数组以流的形式创建

    然而,由于Bitmap对象占用大量的内存,直接加载大图片可能会导致内存溢出(Out Of Memory,OOM)问题。因此,高效地创建和管理Bitmap至关重要。本篇文章将详细介绍如何通过byte数组以流的形式创建Bitmap,并且结合...

    bitmap OOM的解决方案

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

    android文本/图片切换,contentresolver,抽屉,评级,scroll,bitmap使用

    但Bitmap消耗内存较大,不当使用可能导致内存泄漏或OOM(Out Of Memory)异常。因此,我们需要合理使用`BitmapFactory.Options`来控制解码时的大小,使用`Bitmap.createScaledBitmap()`缩放图像,以及使用`Recycle()...

    android bitmap处理

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不妥善管理,它可能会导致显著的内存消耗,进而引发“Out of Memory”(OOM)错误。Android系统为每个应用程序分配了有限的内存空间,当Bitmap对象占用了...

    Android应用源码之(Bitmap位图渲染与操作.zip

    Bitmap对象占用较大的内存空间,不当的使用可能导致内存泄漏或Out of Memory (OOM)错误。Android提供了多种方式来管理Bitmap内存,如使用`BitmapFactory.Options`来设置解码时的配置,如`inSampleSize`可以减小图片...

    Android性能优化(七)Bitmap内存压缩示例源码BitMapCache.zip

    在Android开发中,Bitmap对象是图像处理的核心,但由于其消耗大量内存,不当使用往往会导致应用性能下降甚至引发内存溢出(Out Of Memory)问题。因此,Bitmap的内存管理与优化至关重要,尤其是对于图像密集型应用而...

    bitmap工具类

    在Android系统中,Bitmap对象是用于存储像素数据的,它消耗大量的内存,如果处理不当,很容易引发“OutOfMemory”(OOM)错误。因此,一个强大的Bitmap工具类可以帮助开发者高效、安全地管理图片资源,避免因内存...

Global site tag (gtag.js) - Google Analytics