我有一个名为Dialog FragmentSignInDialogFragment,它是从HomeActivity调用的。调用它时,它将显示用户名和密码EditText字段,并将带有Interface的输入传达给HomeActivity中的相关功能。

当我从SignInDialogFragment调用HomeActivity然后不执行任何操作将其关闭时,LeakCanary警告我内存泄漏。

这是在SignInDialogFragment中设置HomeActivity的方式:

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


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

我不明白的是为什么这种泄漏首先发生。这是我尝试过的一些方法:

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


我试图在片段对话框的SignInDialogFragment.SignInDialogFragmentInterface函数中使侦听器(即onPause)无效;泄漏仍然发生。


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

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


我认为问题可能在这里,但无法解决。

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

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

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

signInDialogFragmentMemoryLeak.hprof

最佳答案

尝试这个

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

09-18 03:54