解決在 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;
} 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值