MVVM Observer
背景
MVVM 是现在 google 推荐的 android 架构方式,而且还推出了 jetpack 套件。基于此套件可以很简单开发一个 MVVM app。
问题
livedata 是 google 推出的观察者模式,因为它和 app 的组件(activity、fragment、service)生命周期绑定,所以会确保在生命周期内才会更新数据。
因为 room 组件支持返回 livedata,但是按照模块顺序是 view -> viewmodel -> repository -> datasource(room、network)。
如果现在需求是在 view 要展示任务列表数据并且随着数据变化实时更新。那么 repository 层返回 livedata,viewmodel 层也定义了 livedata(给 view 展示用),那么难道要在 viewmodel 里在做 livedata 的 observer 吗?尤其是在用了 databinding 的时候
1 | private MutableLiveData<List<Task>> items = new MutableLiveData<>(); |
但是这个问题有点多:
1. 每次调用 loadTasks 都要重新拿一次,既然已经监听了,那何必在拿
2. viewmodel 持有 lifecycleOwner。
3. showtask 多线程调用
4. 返回值没有明确定义。接口不清晰
我们希望的是一开始调接口展示数据,并且监听变化。既然监听了变化,那是否还有必要对外提供刷新接口了。有必要,因为强制刷新是会去服务器查询,监听变化其实主要是针对本地的,远端的可能是隔一段时间查一次。
对 viewmodel 来说它不需要关心是从哪里来怎么来的。