android - 对话框片段中的内存泄漏
问题描述
我有一个Dialog Fragment
名为SignInDialogFragment
from的名称HomeActivity
。当它被调用时,它会显示用户名和密码EditText
字段并将输入传送Interface
到HomeActivity
.
当我调用它然后不做任何事情SignInDialogFragment
将HomeActivity
其关闭时,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
函数中将其无效;没有用。
SignInDialogFragment.SignInDialogFragmentInterface
我试图在片段对话框的onPause
函数中取消监听器(即);泄漏仍然发生。
由于我创建了一个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 - android google map supportmap片段无法在片段中初始化
- compression - 什么可能导致 libbzip2 readOpen 函数出现意外 EOF 错误?
- reactjs - 如何使用 onClick 清除购物车中的商品?
- swift - 声明变量时的 Xcode 单元测试警告
- airflow - 没有按时间触发的气流操作员是否有任何 TriggerRule(需要
- python - 在 Python 代码中检测并启动 celery worker
- javascript - Running into error when trying to run npm run dev command
- c# - 为什么伪随机数生成器不太可能连续生成 54 个大数?
- excel - 如何仅复制 Excel 中填写的那些行?
- python-3.x - Numpy 和 matplotlib:无法编辑图像数组