具有两个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
。但是,如果最后一个帖子来自国家/地区频道,那么在操作系统终止/重新存储流程的情况下又有什么帮助呢?