由於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;}