2011-12-15 52 views
0

我有一個菜單應用程序,其中菜單項是ViewAnimator的視圖的屏幕截圖。一切工作正常。我做screeshots這個簡單的sniplet,使用繪圖緩存寫在許多例子:無法在Android 3.0中釋放內置圖形緩存的內存

// Drawing cache is off, so build it manually and create scaled bitmap 
    layout.buildDrawingCache(); 
    Bitmap bm = layout.getDrawingCache(); 
    Bitmap bm_small = Bitmap.createScaledBitmap(bm, item_width, item_height, true); 

在同一個函數我嘗試釋放用於創建截圖所有內存:

layout.destroyDrawingCache(); 
    bm.recycle(); 
    bm = null; 

但可惜的是在垃圾收集器不釋放此位圖內存。我也用HPROF內存分析來找到一些對Bitmap的引用,它不能被釋放,但是我沒有成功。重要的信息是,我正在爲Honeycomb Android 3.0開發,所以截圖非常大 - 每個截圖都需要大約3MB的內存,並且不會釋放它。

我不明白,爲什麼回收在這個例子中不起作用。我懷疑,在我的設置中有一些非常特殊的問題:Android 3.0蜂窩+硬件加速啓用+大堆啓用+使用圖形緩存。我發現的提示都沒有幫助。

請你能解釋一下,爲什麼recycle在這種情況下不起作用?任何幫助將非常感激。

回答

0

是的,我有這個問題。這是非常糟糕的行爲,因爲位圖不會自行釋放。最好的建議是使用較小的位圖圖塊

和其他建議是使用SoftReference<Bitmap>來存儲您的數據對象。 SoftReferenced對象在需要內存時會自行刪除。儘管如此,你可以收拾丟失的東西。

雖然位圖方法,只是有缺陷。

+0

感謝您的回答。據我所知,我不能使用更小的位圖,因爲我必須從整個佈局製作截圖。而SoftReference解決方案在我看來也不適用,因爲我不存儲任何對Bitmap的引用:/ – 2011-12-16 00:07:42