android.view.ViewRootimpl$RunQueue$HandlerAction 防止 Dialog 被垃圾回收

标签 android memory-leaks garbage-collection

我目前正在构建一个只能在平板电脑上运行的 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.showDialogActivity.removeDialog删除对话框时应删除对对话框的所有引用。

在 Android 3.0 及更高版本中,您可以使用 DialogFragment而不是 DialogFragmentManager 应该为您处理它的生命周期。查看Fragments开发人员指南。

关于android.view.ViewRootimpl$RunQueue$HandlerAction 防止 Dialog 被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7716055/

相关文章:

android - Android 4.2 未显示错误指示器(用于表单验证)?

java - 如何在警报对话框中的消息中给出换行符?

android - xml 文件中的不完整文本导致新创建的 Android Studio 项目出错

c++ - 在 C++ 中管理我的对象时内存分配的逻辑问题

android - 从服务类调用 Activity 类方法

java - Android 资源中的图像导致内存泄漏

Linux下造成内存泄漏

c - 使用 glib 进行垃圾回收时内存泄漏

c# - 是否有任何事件告诉应用程序何时发生了垃圾收集?

C#:有什么方法可以轻松查找/更新对对象的所有引用?