我有一个名为 SignInDialogFragment
的 Dialog Fragment
,它是从 HomeActivity
调用的。当它被调用时,它会呈现用户名和密码EditText
字段,并通过Interface
将输入传递给HomeActivity
中的相关函数。
当我从 HomeActivity
调用 SignInDialogFragment
然后不做任何事情就关闭它时,LeakCanary 警告我存在内存泄漏。
下面是如何在 HomeActivity
中设置 SignInDialogFragment
:
private val signInDialogFragment : SignInDialogFragment by lazy {
SignInDialogFragment.newInstance(object: SignInDialogFragment.SignInDialogFragmentInterface {
override fun onFinish() {
// Do stuff
}
// Here are more interface functions
})
}
我发现当我不使用 lazy
设置 SignInDialogFragment
时,将其设为可选并在 HomeActivity 的
onPause 中取消它
功能,不会发生泄漏。
我不明白的是为什么会发生这种泄漏。这里有一些我尝试过的东西:
-我没有将监听器设置为匿名对象(即 object: SignInDialogFragment.SignInDialogFragmentInterface )
,而是将其设置为可选对象并在 Activity 的 onPause
函数中将其取消;没用。
- 我试图在 fragment 对话框的
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()
关于android - 对话框 fragment 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58049775/