crimeRecyclerView.adapter = adapter
return view
}
override fun onViewCreated(view: View,
savedInstanceState: Bundle?) {
super.onViewCreated(view,
savedInstanceState)
crimeListViewModel.crimeListLiveData.ob
serve(
viewLifecycleOwner,
Observer { crimes ->
crimes?.let {
Log.i(TAG, "Got crimes
${crimes.size}")
updateUI(crimes)
}
})
}
...
}
Функция
LiveData.observe(LifecycleOwner,Observer)
используется для регистрации наблюдателя за экземпляром
LiveData
и связи наблюдения с жизненным циклом другого
компонента.
Второй параметр функции
observe(...)
— это реализация
Observer
. Этот объект отвечает за реакцию на новые данные
из
LiveData
. В этом случае блок кода наблюдателя
выполняется всякий раз, когда обновляется список в
LiveData
.
Наблюдатель получает список преступлений из
LiveData
и
печатает сообщение журнала, если свойство не равно нулю.
Если вы не снимали наблюдателя с прослушивания
изменений в
LiveData
, реализация наблюдателя может
попытаться обновить элемент вашего фрагмента, когда
представление находится в нерабочем состоянии (например,
когда элемент уничтожается). И если вы пытаетесь обновить
недопустимый элемент, ваше приложение может сломаться.
Здесь на сцену выходит параметр
LifecycleOwner
из
LiveData.observe(...)
. Время жизни наблюдателя длится
столько же, сколько и у компонента, представленного
LifecycleOwner
. В примере выше наблюдатель связан с
фрагментом.
Пока владелец жизненного цикла, которому вы передаете
наблюдателя, находится в допустимом состоянии жизненного
цикла, объект
LiveData
уведомляет наблюдателя о получении
новых данных. Объект
LiveData
автоматически снимает
наблюдателя, когда соответствующий жизненный цикл
становится недоступен. Поскольку
LiveData
реагирует на
изменения в жизненном цикле, он относится к категории lifecycle-
aware component. Вы узнаете больше о таких компонентах в
главе 25.
Владелец жизненного цикла — это компонент, который
реализует интерфейс
LifecycleOwner
и содержит объект
жизненного цикла. Жизненный цикл — это объект, который
отслеживает текущее состояние Android на протяжении
жизненного цикла (напомним, что activity, фрагменты,
элементы и даже само приложение имеют свой собственный
жизненный цикл). Состояния жизненного цикла, такие как
создание и возобновление, перечислены в
Lifecycle.State
.
Вы можете запросить состояние жизненного цикла, используя
функцию
Lifecycle.getCurrentState()
, или подписаться
на уведомления об изменениях состояния.
Fragment
в AndroidX является владельцем жизненного
цикла
непосредственно
—
Fragment
реализует
LifecycleOwner
и имеет объект
Lifecycle
, представляющий
состояние жизненного цикла экземпляра фрагмента.
Жизненный цикл вида фрагмента является собственностью
и отслеживается отдельно во
FragmentViewLifecycleOwner
.
Каждый
Fragment
имеет
экземпляр
Frag
ment-
ViewLifecycleOwner
, который отслеживает жизненный цикл
этого фрагмента.
В приведенном выше коде мы определим области
наблюдения, чтобы отслеживать представления жизненного
цикла
фрагмента,
а
не
сам
фрагмент,
передав
viewLifecycleOwner
функции
observe(...)
. Жизненный
цикл представления фрагмента, хотя и отделен от жизненного
цикла самого экземпляра фрагмента, отражает жизненный
цикл фрагмента. Можно изменить поведение по умолчанию,
удержав фрагмент (что мы не будем делать в CriminalIntent). Вы
узнаете больше о жизненном цикле представления и
удержании фрагментов в главе 25.
Fragment.onViewCreated(...)
вызывается
после
возврата
Fragment.onCreate
View(...)
, давая понять, что
иерархия представления фрагмента находится на месте. Мы
наблюдали за
LiveData
от
onViewCreated(...)
, чтобы
убедиться, что виджет готов к отображению данных о
преступлении. Именно поэтому вы передаете функции
observe()
объект
viewLifecycleOwner
, а не сам фрагмент.
Нам нужно получать список преступлений только в том случае,
если представление в должном состоянии, и тогда вы не будете
получать уведомления, когда виджет не находится на экране.
Когда список преступлений готов, наблюдатель выводит
сообщение и посылает список в
updateUI()
для подготовки
адаптера.
Теперь запустите CriminalIntent. Ошибок больше быть не
должно. Вместо этого вы должны увидеть преступления из
файла базы данных, загруженного в ваш эмулятор (рис. 11.8).
В следующей главе мы подключим список преступлений к
экрану и заполним этот экран подробными данными.
Do'stlaringiz bilan baham: |