Утечка памяти во фрагменте диалога - PullRequest
1 голос
/ 22 сентября 2019

У меня есть 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

1 Ответ

0 голосов
/ 22 сентября 2019

Попробуйте это

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

...