Существует два разных жизненных цикла, потому что сам фрагмент живет дольше, чем вид фрагмента.
Существует ряд событий, которые могут привести к разрушению вида фрагмента, но в настоящее время он поддерживает сам фрагмент:
- Помещение фрагмента в задний стек (т. Е. Когда вы
navigate()
переходите к другому фрагменту) - Вызов
detach()
во фрагмент - Вызов
setMaxLifecycle(Lifecycle.State.CREATED)
на фрагменте
В этих случаях представление фрагмента разрушается, перемещая жизненный цикл представления фрагмента на DESTROYED
. Однако сам жизненный цикл фрагмента не разрушен - обычно он остается как CREATED
. Это означает, что фрагмент может проходить через несколько циклов onCreateView()
-> onViewCreated()
-> onDestroyView()
, проходя только один раз onCreate()
.
Когда это становится проблемой, возникает вопрос о том, какLiveData
работает. Когда вы observe
a LiveData
, LiveData
автоматически отменяет регистрацию наблюдателя, когда жизненный цикл достигает DESTROYED
. Но если вы используете жизненный цикл фрагмента до observe
в onCreateView()
и т. Д., Этот зарегистрированный наблюдатель все еще будет существовать после onDestroyView()
, несмотря на уничтожение вида. Это означает, что во второй раз, когда ваш фрагмент проходит через onCreateView()
, вы фактически создадите второго активного наблюдателя, причем оба будут работать одновременно. Затем три наблюдателя в следующий раз и снова включите.
Используя представление LifecycleOwner в onCreateView()
/ onViewCreated()
, вы гарантируете, что одновременно будет работать только один активный наблюдатель, и что наблюдатели связанык предыдущему представлению экземпляры корректно уничтожаются вместе с представлением. Таким образом, да, вы всегда должны использовать getViewLifecycleOwner()
в качестве LifecycleOwner, когда находитесь в onCreateView()
или onViewCreated()
, в том числе при использовании привязки данных.
Конечно, если вы регистрируетесьОбозреватель в onCreate()
, тогда представление LifecycleOwner еще не существует (оно создано прямо перед onCreateView()
), и у вас нет проблемы множественной регистрации, поэтому проверка Lint специально не применяется к выполненным регистрациям. в onCreate()
время. В этих случаях использование самого жизненного цикла Фрагмента абсолютно правильно.
Согласно Фрагментам: прошлое, настоящее и будущее , одно из будущих улучшений для Фрагментов будет объединять дважизненные циклы вместе, всегда уничтожая Фрагмент всякий раз, когда вид Фрагмента разрушен. Это еще не доступно ни в одной поставленной версии Фрагментов, альфа или иным образом.