Как использовать одну LiveData для нескольких данных и выжить после уничтожения / восстановления активности - PullRequest
0 голосов
/ 02 ноября 2019

Имея два 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. Но как это поможет в случае уничтожения / восстановления потока ОС, если последнее сообщение пришло из государственного канала?

...