2012-12-07 31 views
7

是否有人知道如何從android.view.GLES20DisplayList釋放位圖。 爲什麼它讓他們活着,即使你乾淨,比方說,手動ImageView? 或者也許有一種方法來禁用GLES20DisplayList,試圖在AndroidManifest中使用android:hardwareAccelerated =「false」,仍然沒有運氣。從android.view.GLES20DisplayList釋放位圖

貌似只有在受影響的4.2(1)

更新:(?BUG)看起來就像你不能在4.2.1禁用硬件加速

簡單的測試:

Android manifest: 
application ... android:hardwareAccelerated="false" 

System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated()); 
mListView.setLayerType(LAYER_TYPE_SOFTWARE, null); 
System.out.println("isHardwareAccelerated: " + mListView.isHardwareAccelerated()); 

結果:

12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true 
12-06 17:15:27.129: I/System.out(30752): isHardwareAccelerated: true 

回答

3

這似乎到b e 4.2中的內存泄漏。看起來像這個修復是針對它:https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0

我禁用硬件加速在清單4.2爲我遇到此問題的活動,這有助於與android.view.GLES20DisplayList內存持有。

在清單中的活動: android:hardwareAccelerated="@bool/gpu_enabled"

在values.xml爲V17:

<bool name="gpu_enabled">false</bool> 

在默認values.xml,我將它設置爲true。

+1

發生這種情況是因爲它們保留位圖直到刪除視圖。這裏是來自GLES20DisplayList的評論: /*這些列表確保DisplayList記錄的任何位圖和顯示列表在DisplayList處於活動狀態時保持活動狀態。 Bitmap和DisplayList列表由GLES20RecordingCanvas在適當的繪圖調用期間填充,並在新繪圖框架開始時或視圖從窗口分離時清除。 * /基本上你需要分離視圖才能夠回收位圖/可繪製。 – vovkab

+0

我刪除了onStop中的視圖,仍然保留着內存。 (僅在4.2) –

+0

內存分析儀顯示什麼?也許其他人正在保持參考或上下文被泄露?嘗試完全從ImageViews清理位圖,然後分離視圖。 – vovkab

1

我最近對這個問題做了深入的內存分析。正如Yulia在上面指出的那樣,禁用硬件加速通常會起到訣竅的作用。或者,您可以將ImageView的Drawable設置爲null,回收位圖,或者像您指出的那樣分離ImageView。

但是,取決於API版本,位圖存儲器可能會或可能不會從GLES20DisplayList中釋放。我在my blog post – Android Bitmap Memory Analysis上深入討論了這些不同的行爲和可能的解決方案,但快速解決方案是禁用硬件加速。

+1

感謝您的博客文章,它確實有助於充分理解問題 –