【问题标题】:android.view.ViewRoot$RunQueue$HandlerAction prevents Dialog from beeing garbage collectedandroid.view.ViewRootimpl$Run Queue$HandlerAction 防止 Dialog 被垃圾回收
【发布时间】: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


【解决方案1】:

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

或者,您可以考虑使用 API 来处理 Dialog 的生命周期。已弃用的 Activity.showDialogActivity.removeDialog 应在删除对话框时删除对对话框的所有引用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2021-01-18
    • 2011-12-20
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多