由于Android自己的限制,在2.x版中使用 Bitmap 只要遇到稍大一点的图,很容易就会遇到 out of memory 的情况,在通过一阵搜寻以后,一直没有很好的方法,有不少网站介绍的方法是把原图 subsample,但对于图片quality有要求的程序来讲,这但是不被接受的解法,搞了半天,最后只好直接把 Android 的 source code 拿出来瞧瞧看看是否有什么机会解决这个问题,忽然发现原来这个问题居然有个投机取巧的解决方法。java
目前在网站上找到的结果,效果最有效的是使用 eclipse
BitmapFactory.Options 网站
将里面的 inPurgeable 设定为 true,这样可让java系统内存不足时先行回收部分的内存,这个方法其实已经解决大部分的问题了,不过生出来的内存仍是算在java 的VM里老是有些美中不足。spa
在看了source code 以后,我发如今BitmapFactory.Options里居然有一个inNativeAlloc的public变量,能够直接不把使用的内存算到VM里,有趣的是这个变量是个隐藏版的变量,因此在正常的SDK文件中看不到,用eclipse时也不会提示你,也不能直接用,所以我用了一些小技巧将这个变量设成true,如此一来bitmap out of memory的问题发生的机率又更低了,如下就是目前的程序代码,有须要的人能够参考一下,不过无论怎么样,bitmap这东西,只要不用了,仍是请尽可能将它recycle,否则再多内存也是不够用地~code
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;}