我有一个名为Dialog Fragment
的{{1}},从SignInDialogFragment
开始。调用时,它将显示用户名和密码HomeActivity
字段,并将带有EditText
的输入传送到Interface
中的相关功能。
当我从HomeActivity
调用SignInDialogFragment
并随后不执行任何操作而将其关闭时,LeakCanary会警告我内存泄漏。
在HomeActivity
中设置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
我认为问题可能在这里,但无法解决。
我对内存泄漏和垃圾回收还很陌生,所以我希望自己没有犯一些明显的错误。:)
知道导致泄漏的原因是什么?预先感谢!
编辑:这是可能有用的.hprof文件。
答案 0 :(得分:0)
尝试一下
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()