Имея два liveData, одно для истинных данных, одно для состояния, то есть состояния, такие как завершение, или сбой с некоторым кодом.
data_liveData?.observe(viewLifecycleOwner,
Observer<List<Data>> { list ->
list?.let {
...
}
})
state_liveData?.observe(viewLifecycleOwner,
Observer<State> { state ->
state?.let {
...
}
})
теперь нужно изменить, чтобы использовать только одну liveData для доставки обоих данныхи состояние.
мы могли бы определить класс оболочки
class Wrapper (val data: List<Data>:?=null, val state: State?=null)
и
wrapper_liveData?.observe(viewLifecycleOwner,
Observer<Wrapper> { wrapper ->
if (wrapper.data != null) {
// handle data post
} else if (wrapper.state != null) {
// handle state
}
})
, это работает, но есть проблема, и мы не уверены, каков рекомендуемый способчтобы справиться с этим.
при регистрации для наблюдения liveData, если ранее были опубликованы некоторые данные, они будут немедленно доставлены в onChange () наблюдателя.
Что, если были некоторыесписок данных, опубликованный до публикации состояния ошибки в liveData, а затем os убивает действие и затем восстанавливает его обратно.
Во время процесса восстановления liveData (все еще живы и выжили после оса, уничтожив фрагмент в viewModel) повторно отслеживается кодом запуска фрагмента, который сразу же получает последнее опубликованное значение в liveData и является State
.
Но проблема в том, что пользовательский интерфейс фрагмента не сможет восстановить с помощью ранее отображенных данных в пользовательском интерфейсе.
кто-то говорит, что в случае восстановления нужно просто начать все заново (такие данные повторного извлечения данных)из удаленного репозитория. Но разве это не то, что viewModel пытается избежать?)
кажется MediatorLiveData
упоминаются в нескольких постах для объединения нескольких liveData. Но как это поможет в случае уничтожения / восстановления потока ОС, если последнее сообщение пришло из государственного канала?