从android.view.GLES20DisplayList释放位图

时间:2012-12-07 00:04:28

标签: android memory-leaks out-of-memory

有谁知道如何从android.view.GLES20DisplayList释放位图。 为什么它会让它们保持活力,即使你清洁,让我们说,ImageView手动? 或许有一种方法可以禁用GLES20DisplayList,试图在AndroidManifest中使用android:hardwareAccelerated =“false”,仍然没有运气。

看起来只受4.2(1)

的影响

更新:看起来你无法在4.2.1上禁用硬件加速(bug?)

简单测试:

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

2 个答案:

答案 0 :(得分:3)

这似乎是4.2中的内存泄漏。看起来此修复程序是针对它的:https://android.googlesource.com/platform/frameworks/base/+/034de6b1ec561797a2422314e6ef03e3cd3e08e0

我在清单中为我遇到此问题的活动禁用了硬件加速,这有助于android.view.GLES20DisplayList内存保存。

在活动清单中: android:hardwareAccelerated="@bool/gpu_enabled"

在v17的values.xml中:

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

在default values.xml中,我将其设置为true。

答案 1 :(得分:1)

我最近对这个问题进行了深入的记忆分析。正如Yulia在上面指出的那样,禁用硬件加速通常会起到作用。或者,您可以将ImageView的Drawable设置为null,回收位图,或者在您指出时分离ImageView。

但是,根据API版本,位图内存可能会也可能不会从GLES20DisplayList中释放。我在my blog post – Android Bitmap Memory Analysis上深入讨论了这些不同的行为和可能的解决方案,但快速解决方案是禁用硬件加速。