【发布时间】:2020-01-22 18:37:40
【问题描述】:
我有一个名为SignInDialogFragment 的Dialog Fragment,它是从HomeActivity 调用的。当它被调用时,它会显示用户名和密码EditText 字段并将Interface 的输入传递给HomeActivity 中的相关函数。
当我从 HomeActivity 调用 SignInDialogFragment 然后不做任何事情将其关闭时,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 函数中将其无效;没有用。
- 我试图在片段对话框的
onPause函数中取消监听器(即SignInDialogFragment.SignInDialogFragmentInterface);泄漏仍然发生。
由于我使用静态函数创建了 SignInDialogFragment 的新实例:
companion object {
fun newInstance(listener: SignInDialogFragmentInterface) : SignInDialogFragment {
val dialogFragment = SignInDialogFragment()
dialogFragment.listener = listener
return dialogFragment
}
}
我认为问题可能在这里,但无法弄清楚。
我对内存泄漏和垃圾收集还很陌生,所以我希望我没有犯一些明显的错误。:)
知道导致泄漏的原因吗?提前致谢!
编辑:这是 .hprof 文件可能会有所帮助。
【问题讨论】:
-
您无权下载.hprof文件
-
更改了链接。
-
Dialogs 已被销毁,一旦关闭,不应再使用。即使在将DialogFragment关闭后,您仍然持有对它的硬引用,这就是为什么在您将其设置为 null 后错误消失的原因。在这种情况下,侦听器无关紧要。 -
@Pawel 所以我应该将其传递为
WeakReference?
标签: android kotlin memory-leaks