Android 对话框片段内存泄漏
我有一个名为SignInDialogFragment的对话框片段,它是从HomeActivity调用的。调用时,它会显示用户名和密码文本字段,并通过接口将输入传递给HomeActivity中的相关函数 当我从HomeActivity调用SignInDialogFragment,然后不做任何事情就将其关闭时,LeakCanary警告我内存泄漏 以下是如何在HomeActivity中设置SignInDialogFragment: 我发现,当我不使用lazy设置SignInDialogFragment,将其设置为可选,并在HomeActivity的onPause函数中将其置为空时,泄漏就不会发生 我不明白的是,为什么会发生这种泄漏。以下是我尝试过的几件事: -我没有将侦听器设置为匿名对象,即object:SignInDialogFragment.SignInDialogFragmentInterface,而是将其设置为可选对象,并在活动的onPause函数中将其置为空;没用 我试图在片段对话框的onPause函数中取消侦听器,即SignInDialogFragment.SignInDialogFragmentInterface;泄漏仍然发生。 由于我使用静态函数创建了SignInDialogFragment的新实例:Android 对话框片段内存泄漏,android,kotlin,memory-leaks,Android,Kotlin,Memory Leaks,我有一个名为SignInDialogFragment的对话框片段,它是从HomeActivity调用的。调用时,它会显示用户名和密码文本字段,并通过接口将输入传递给HomeActivity中的相关函数 当我从HomeActivity调用SignInDialogFragment,然后不做任何事情就将其关闭时,LeakCanary警告我内存泄漏 以下是如何在HomeActivity中设置SignInDialogFragment: 我发现,当我不使用lazy设置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
}