【问题标题】:Memory Leak in Dialog Fragment对话框片段中的内存泄漏
【发布时间】:2020-01-22 18:37:40
【问题描述】:

我有一个名为SignInDialogFragmentDialog Fragment,它是从HomeActivity 调用的。当它被调用时,它会显示用户名和密码EditText 字段并将Interface 的输入传递给HomeActivity 中的相关函数。

当我从 HomeActivity 调用 SignInDialogFragment 然后不做任何事情将其关闭时,LeakCanary 会警告我存在内存泄漏。

这是SignInDialogFragmentHomeActivity 中的设置方式:

private val signInDialogFragment : SignInDialogFragment by lazy {
    SignInDialogFragment.newInstance(object: SignInDialogFragment.SignInDialogFragmentInterface {
        override fun onFinish() {
           // Do stuff
        }
        // Here are more interface functions
    })
}

我发现当我不设置SignInDialogFragmentlazy 时,将其设为可选并在HomeActivity's onPause 函数中将其无效,不会发生泄漏。

我不明白为什么会发生这种泄漏。以下是我尝试的几件事:

-我没有将侦听器设置为匿名对象(即object: SignInDialogFragment.SignInDialogFragmentInterface ),而是将其设置为可选项并在活动的onPause 函数中将其无效;没有用。

  • 我试图在片段对话框的onPause 函数中取消监听器(即SignInDialogFragment.SignInDialogFragmentInterface);泄漏仍然发生。

由于我使用静态函数创建了 SignInDialogFragment 的新实例:

companion object {
    fun newInstance(listener: SignInDialogFragmentInterface) : SignInDialogFragment {
        val dialogFragment = SignInDialogFragment()
        dialogFragment.listener = listener
        return dialogFragment
    }
}

我认为问题可能在这里,但无法弄清楚。

我对内存泄漏和垃圾收集还很陌生,所以我希望我没有犯一些明显的错误。:)

知道导致泄漏的原因吗?提前致谢!

编辑:这是 .hprof 文件可能会有所帮助。

signInDialogFragmentMemoryLeak.hprof

【问题讨论】:

  • 您无权下载.hprof文件
  • 更改了链接。
  • Dialogs 已被销毁,一旦关闭,不应再使用。即使在将 DialogFragment 关闭后,您仍然持有对它的硬引用,这就是为什么在您将其设置为 null 后错误消失的原因。在这种情况下,侦听器无关紧要。
  • @Pawel 所以我应该将其传递为WeakReference

标签: android kotlin memory-leaks


【解决方案1】:

试试这个

private  var listener : SignInDialogFragmentInterface? =null

override fun onAttach(context: Context) {
        super.onAttach(context)
        listenrer = context as SignInDialogFragmentInterface

    }

    override fun onDetach() {
        super.onDetach()
        listenrer = null
    }

现在使用 listener.onfinish()

【讨论】:

  • 嗨 Kishan,感谢您的回答。我按照您的建议进行了尝试,但根据 LeakCanary,泄漏仍然存在。
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 2013-11-30
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多