`
cppmule
  • 浏览: 436719 次
  • 性别: 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 outofMemory 用来解决android中常见的bitmap outOfMemory

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

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

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

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

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

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

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

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

    首先,OOM就是内存溢出,即Out Of Memory。也就是说内存占有量超过了VM所分配的最大。 怎么解决OOM,通常OOM都发生在需要用到大量内存的情况下(创建或解析Bitmap,分配特大的数组等),在这样的一种情况下,就可能...

    Android Image Cache

    Android Image Cache,use disccache,memory cache to limit the program's bitmap's memory,in case of OutOfMemory error!

    android BitmapFactory.Options使用方法详解

    方法将突破转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。怎么避免它呢? 这就用到了我们上面提到的BitmapFactory.Options这个类。 BitmapFactory.Options这个类,有一个字

    Android相机拍照、截图功能的实例演示

     将保存在本地的图片取出并缩小后显示在界面上、由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常、将处理过的图片显示在界面上,并保存到本地、使用ContentProvider通过URI获取原始图片、为...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    解析Android开发优化之:对Bitmap的内存优化详解

    在Android应用里,最耗费内存的...而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常。所以,对于图片的内存优化,是Android应用开发中比较重要的内容

    Android的内存机制和溢出说明

    关于android内存机制的介绍,以及bitmap的内存泄露等问题的处理方式

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

    每个人在最初学习Android的时候肯定都会知道这么一个原因:我们编写的应用程序都是有一个最大内存限制,其中JAVA程序和C程序(NDK调用时)共享这一块内存大小,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常...

    Android利用软引用和弱引用避免OOM的方法

     在Java中,虽然不需要程序员手动去管理对象的生命周期,但是如果希望某些对象具备一定的生命周期的话(比如内存不足时JVM就会自动回收某些对象从而避免OutOfMemory的错误)就需要用到软引用和弱引用了。...

    Android图片缓存之Lru算法(二)

    我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发生的概率呢?之前我们一直在使用SoftReference软引用,SoftReference是一种现在已经不再推荐使用的方式,因为从 ...

    Android获取本地相册图片和拍照获取图片的实现方法

    需求:从本地相册找图片,或通过调用系统相机拍照得到图片。 容易出错的地方: 1、当我们指定了照片的uri路径,我们就不能通过data.getData();...就容易出现 out of memory(oom)错误,我们需要先把URI转换

    Android 加载大图、多图和LruCache缓存详细介绍

    大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少 int maxMemory = (int) (Runtime....

    Android重写Gallery

    //An interpolator defines the rate of change of an animation. This allows the basic animation effects (alpha, scale, translate, rotate) to be accelerated, decelerated, repeated, etc. private ...

    TMS Pack for FireMonkey2.3.0.1

    Fixed : Issue with state changing with mouse out of bounds in TTMSFMXSlider Fixed : Issue with resizing detail view in TTMSFMXTableView v1.5.0.0 New : Components TTMSFMXGrid, TTMSFMXNavBar, ...

Global site tag (gtag.js) - Google Analytics