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

标签 android kotlin memory-leaks

我有一个名为 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/

相关文章:

java - 将值设置为静态变量返回错误

android - 在 kotlin 中如何为 recyclerview 适配器设置点击事件

Android - 添加 UNDO SnackBar 滑动删除

memory-management - 如何分析 Dart 应用程序中的内存使用情况?

c++ - 释放后似乎未由较低级别的分配例程释放内存

android - onBackPressed() 覆盖

用于增强现实的 Android API - gps 和指南针

Android ViewHolder 背景颜色

java - 如何通过 RouterFunctionMapping 在 Spring 5 webflux 中注册多个 RouterFunction?

memory-leaks - ffmpeg/libavcodec 内存管理