对话框片段中的内存泄漏

时间:2019-09-22 13:42:13

标签: android kotlin memory-leaks

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

signInDialogFragmentMemoryLeak.hprof

1 个答案:

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