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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private MutableLiveData<List<Task>> items = new MutableLiveData<>();
public void loadTasks(boolean forceUpdate) {
tasksRepository.getTasks(forceUpdate, new LoadTasksCallback() {
@Override
public void onTasksLoaded(@NonNull LiveData<List<Task>> tasks) {
tasks.observe(lifecycleOwner, new Observer<List<Task>>() {
@Override
public void onChanged(List<Task> tasks) {
showTask(tasks);
}
});
List<Task> taskList = tasks.getValue();
if (taskList != null && !taskList.isEmpty()) {
showTask(taskList);
}
}

@Override
public void onDataNotAvailable() {
isDataLoadingError.setValue(true);
items.setValue(new ArrayList<Task>());
}
});
}

但是这个问题有点多:
1. 每次调用 loadTasks 都要重新拿一次,既然已经监听了,那何必在拿
2. viewmodel 持有 lifecycleOwner。
3. showtask 多线程调用
4. 返回值没有明确定义。接口不清晰

我们希望的是一开始调接口展示数据,并且监听变化。既然监听了变化,那是否还有必要对外提供刷新接口了。有必要,因为强制刷新是会去服务器查询,监听变化其实主要是针对本地的,远端的可能是隔一段时间查一次。
对 viewmodel 来说它不需要关心是从哪里来怎么来的。