【发布时间】:2011-12-04 16:31:28
【问题描述】:
我目前正在构建一个只能在平板电脑上运行的 Android 应用程序。 一个功能是在(自定义创建的)对话框中显示事件列表。
在某些情况下,当用户确认这些事件时,对话框并没有被垃圾回收,并且在多次打开对话框后,保存在内存中的对话框实例的数量越来越多。
由于应用程序要运行很长时间,我想这会导致内存问题。
所以我进行了内存转储并启动了 Eclipse 内存分析器 (MAT)。 我以前从未遇到过此类问题,而且我对 MAT 不太熟悉,但这是我的假设:
我可以看到我的 Dialog 有几个实例和一些“内部类”(MyDialog$1)仍然存在。对于所有其他“内部类”(MyDialog$2、MyDialog$3、...),计数为 0。
使用“合并到 GC Roots 的最短路径”和“包含所有引用”选项会导致我 android.view.ViewRoot$RunQueue$HandlerAction,所以我的假设是不知何故保留了我的一位听众的引用?
我希望您能告诉我我的假设(以及我的分析方式)是否正确。 希望你能给我一个解决方案或提示如何解决这个问题。
提前致谢 斯文
【问题讨论】:
-
如何创建对话框?你什么时候注册你的听众?
-
对话框是android.app.Dialog的子类。构造函数 Dialog(Context context, int theme) 被覆盖。这是添加 GUI 元素和注册监听器的地方。
-
你是使用 Activity.showDialog 还是 DialogFragment 来显示对话框?
-
对话框使用
new MyDialog(getContext()).show();显示
标签: android memory-leaks garbage-collection