如何将一个LiveData用于多个数据并从操作系统中生存下来,杀死/恢复活动

时间:2019-11-02 01:08:27

标签: android-livedata mediatorlivedata

具有两个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(仍然有效并从os中存活下来,杀死了ViewModel中的片段),片段的启动代码会立即对其进行观察,该代码立即接收liveData中最后发布的值,即State

但是问题是片段UI无法使用UI上先前显示的数据进行还原。

有人说在恢复情况下只是一个全新的开始(例如从远程存储库中重新拉数据。但这不是viewModel试图避免的事情吗?)

在合并多个liveData的几篇文章中提到了

似乎MediatorLiveData。但是,如果最后一个帖子来自国家/地区频道,那么在操作系统终止/重新存储流程的情况下又有什么帮助呢?

0 个答案:

没有答案