android.view.ViewRoot $ RunQueue $ HandlerAction防止Dialog收集垃圾

时间:2011-10-10 16:49:46

标签: android memory-leaks garbage-collection

我目前正在构建一个仅在平板电脑上运行的Android应用程序。 一个功能是在(自定义创建的)对话框中显示事件列表。

在某些情况下,当用户确认这些事件时,对话框不会被垃圾收集,并且在多次打开对话框后,保留在内存中的对话框实例数量也在增加和增加。

由于应用程序要运行很长时间,我想这会导致内存问题。

所以我进行了内存转储并启动了Eclipse Memory Analyzer(MAT)。 我之前从未遇到过这类问题而且我对MAT不太熟悉,但这就是我的假设:

我可以看到我的Dialog有几个实例,还有一些“内部类”(MyDialog $ 1)。对于所有其他“内部类”(MyDialog $ 2,MyDialog $ 3,...),计数为0。

使用“将最短路径合并到GC根”并使用“包含所有引用”选项引导我 android.view.ViewRoot $ RunQueue $ HandlerAction,所以我的假设是不知何故有一个我的听众的引用被保留了?

我希望你能告诉我我的假设(以及我的分析方式)是否正确。 希望你能给我一个解决方案或提示如何解决这个问题。

提前致谢 斯文

1 个答案:

答案 0 :(得分:1)

我认为你的假设是正确的。作为匿名类的侦听器将具有对封闭类的引用。如果希望对话框被销毁,则应取消注册侦听器。

或者,您可以考虑使用API​​来处理Dialog的生命周期。不推荐使用的Activity.showDialogActivity.removeDialog应删除对话框中的所有引用。

在Android 3.0及更高版本中,您可以使用DialogFragment代替DialogFragmentManager应该为您处理它的生命周期。请参阅Fragments开发人员指南。

相关问题