我目前正在构建一个只能在平板电脑上运行的 Android 应用程序。 一项功能是在(自定义创建的)对话框中显示事件列表。
在某些情况下,当用户确认这些事件时,对话框不会被垃圾回收,并且在多次打开对话框后,保存在内存中的对话框实例的数量会越来越多。
由于应用程序要运行很长时间,我猜这会导致内存问题。
所以我进行了内存转储并启动了 Eclipse 内存分析器 (MAT)。 我以前从来没有遇到过这种问题,我对 MAT 也不太熟悉,但这是我的假设:
我可以看到我的 Dialog 的几个实例和一些“内部类”(MyDialog$1) 仍然存在。对于所有其他“内部类”(MyDialog$2、MyDialog$3、...),计数为 0。
使用“Merge shortest paths to GC Roots”和选项“with all references”导致我 android.view.ViewRoot$RunQueue$HandlerAction,所以我的假设是以某种方式保留了我的一位听众的引用?
希望您能告诉我我的假设(以及我的分析方式)是否正确。 希望你能给我一个解决方案或提示如何解决这个问题。
提前致谢 斯文
最佳答案
我认为你的假设是正确的。作为匿名类的监听器将引用封闭类。当您希望销毁对话时,您应该取消注册监听器。
或者,您可以考虑使用 API 来处理对话框的生命周期。弃用的 Activity.showDialog
和 Activity.removeDialog
删除对话框时应删除对对话框的所有引用。
在 Android 3.0 及更高版本中,您可以使用 DialogFragment
而不是 Dialog
,FragmentManager
应该为您处理它的生命周期。查看Fragments开发人员指南。
关于android.view.ViewRootimpl$RunQueue$HandlerAction 防止 Dialog 被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7716055/