7

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

看起来只在 4.2(1) 中受到影响

更新:看起来你不能在 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
4

2 回答 2

3

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

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

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

在 v17 的 values.xml 中:

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

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

于 2013-01-10T12:45:42.437 回答
1

我最近对这个问题进行了深入的内存分析。正如 Yulia 上面指出的那样,禁用硬件加速通常可以解决问题。或者,您可以将 ImageView 的 Drawable 设置为 null,回收位图,或按照您的指示分离 ImageView。

但是,根据 API 版本,位图内存可能会或可能不会从 GLES20DisplayList 中释放。我在我的博文——Android 位图内存分析中深入讨论了这些不同的行为和可能的解决方案,但快速的解决方案是禁用硬件加速。

于 2014-03-10T05:59:11.173 回答