Сохранение ссылки на представление во фрагменте вызывает утечки памяти? - PullRequest
0 голосов
/ 24 сентября 2019

Пожалуйста, кто-нибудь сказал мне следующее, но я немного озадачен.

Пожалуйста, не могли бы вы подтвердить или оспорить это?

(Фрагмент не сохраняется через setRetainInstance()


В настоящее время обычной практикой является инициализация представлений во фрагментах следующим образом:

private lateinit var myTextView: TextView

fun onViewCreated(view: View, bundle: Bundle) {

     ...

     myTextView = view.findViewById(R.id.myTextViewId)

     ...

}

И тогда мыНикогда не аннулируйте это свойство. Хотя это обычная практика, это вызывает утечку памяти.

Предпосылки к этому:

Переход от фрагмента A к B выполняется FragmentManager с использованием определенной FragmentTransaction.В зависимости от типа транзакции, менеджер может захотеть уничтожить представление фрагмента, но при этом сохранить экземпляр самого фрагмента (см. Ниже часть жизненного цикла, где говорится «фрагмент возвращается к макету из заднего стека»).Когда пользователь переходит назад, тот же экземпляр фрагмента переносится на передний план, но создается новое представление.

Проблема в том, что если мы сохраним экземпляр в нашем представлении вСвойство lateinit и никогда не очищать ссылку на него, представление не может быть полностью уничтожено, что приводит к утечке памяти.

1 Ответ

1 голос
/ 24 сентября 2019

Существует метод жизненного цикла фрагмента, называемый onDestroyView, который вы должны переопределить, чтобы освободить любую ссылку на представления.

Обычно вы должны использовать lateinit var ссылки на просмотр, только если ваш Fragment постоянно добавлен вActivity и он не будет удален.

Расширения Kotlin View Binding уже решают эту проблему, автоматически очищая кэш представления внутри onDestroyView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...