我有一个名为Dialog Fragment
的SignInDialogFragment
,它是从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()