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

来源:互联网 发布:贝塔系数的算法 编辑:程序博客网 时间:2024/06/06 05:55

转自: http://my.oschina.net/u/169544/blog/54938

0人收藏此文章, 我要收藏发表于2天前 , 已有8次阅读 共0个评论

因为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;} 
原创粉丝点击