Особенности жизненного цикла фрагмента
Вопрос
Чем жизненный цикл фрагмента отличается от Activity и какие ошибки из-за этого делают?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
У фрагмента два цикла: свой и его view
В back stack вызывается onDestroyView, но не onDestroy
Подписки на UI через viewLifecycleOwner
Binding обнулять в onDestroyView
Не держать view в by lazy и полях без очистки
Получать ViewModel через by viewModels или activityViewModels
Что могут спросить следом
- Что такое FragmentResult API?
- Почему нельзя передавать аргументы через конструктор фрагмента?
Разбор
Главное отличие: у фрагмента два жизненных цикла, самого фрагмента и его view. Когда фрагмент уходит в back stack, его view уничтожается (onDestroyView), а объект фрагмента остаётся, и при возврате view создаётся заново в onCreateView. Из этого растут типичные ошибки. Если подписаться на LiveData или Flow с владельцем this, подписка переживёт view, и после возврата появится дубль, а старый обработчик будет трогать уничтоженную view. Поэтому всё UI-шное привязываю к viewLifecycleOwner и собираю через repeatOnLifecycle. Ссылку на ViewBinding обнуляю в onDestroyView, иначе фрагмент держит всю иерархию view. По той же причине не кладу view-зависимые объекты в by lazy. Аргументы передаю через arguments, а не конструктор: система пересоздаёт фрагмент пустым конструктором после смерти процесса.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Смена конфигурации и сохранение состояния
Следующий вопрос
Почему во фрагменте нужен viewLifecycleOwner
Ещё по теме «Жизненный цикл Activity и Fragment»
- Порядок колбэков при переходе между Activity
- TransactionTooLargeException и Bundle
- Колбэки Activity
- Состояния Lifecycle
- Что переживает поворот и смерть процесса
- Жизненный цикл фрагмента и его view
- Гарантирован ли onDestroy
- Почему onPause должен быть быстрым