首页 > 解决方案 > 对话框片段中的内存泄漏

问题描述

我有一个Dialog Fragment名为SignInDialogFragmentfrom的名称HomeActivity。当它被调用时,它会显示用户名和密码EditText字段并将输入传送InterfaceHomeActivity.

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

以下是如何SignInDialogFragment设置HomeActivity

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函数中将其无效;没有用。

由于我创建了一个SignInDialogFragment带有静态函数的新实例:

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

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

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

知道是什么原因导致泄漏吗?提前致谢!

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

signInDialogFragmentMemoryLeak.hprof

标签: androidkotlinmemory-leaks

解决方案


尝试这个

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()


推荐阅读