gpt4 book ai didi

android - 对话框 fragment 中的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 05:02:18 24 4
gpt4 key购买 nike

我有一个名为 SignInDialogFragmentDialog 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 文件。

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()

关于android - 对话框 fragment 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58049775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com