У меня есть Dialog Fragment
с именем SignInDialogFragment
, который вызывается с 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, который может помочь.
signInDialogFragmentMemoryLeak.hprof