Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对话框片段内存泄漏_Android_Kotlin_Memory Leaks - Fatal编程技术网

Android 对话框片段内存泄漏

Android 对话框片段内存泄漏,android,kotlin,memory-leaks,Android,Kotlin,Memory Leaks,我有一个名为SignInDialogFragment的对话框片段,它是从HomeActivity调用的。调用时,它会显示用户名和密码文本字段,并通过接口将输入传递给HomeActivity中的相关函数 当我从HomeActivity调用SignInDialogFragment,然后不做任何事情就将其关闭时,LeakCanary警告我内存泄漏 以下是如何在HomeActivity中设置SignInDialogFragment: 我发现,当我不使用lazy设置SignInDialogFragment

我有一个名为SignInDialogFragment的对话框片段,它是从HomeActivity调用的。调用时,它会显示用户名和密码文本字段,并通过接口将输入传递给HomeActivity中的相关函数

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

以下是如何在HomeActivity中设置SignInDialogFragment:

我发现,当我不使用lazy设置SignInDialogFragment,将其设置为可选,并在HomeActivity的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文件,可能会有所帮助

试试这个

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的说法,泄漏仍然存在。您无权下载。hprof文件更改了链接。对话框将被销毁,一旦关闭,不应重复使用。即使在DialogFragment被取消后,您仍保留对它的硬引用,这就是为什么将其设置为null后错误消失的原因。“在这种情况下,侦听器并不重要。@Pawel那么我应该将其作为WeakReference传递吗?”?
private  var listener : SignInDialogFragmentInterface? =null

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

    }

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