LiveData通过使用Transform来关联ViewModel和DataModel
Transform LiveData
public class DataModel {
...
public MutableLiveData<List<Repo>> searchRepo(String query) {
final MutableLiveData<List<Repo>> repos = new MutableLiveData<>();
githubService.searchRepos(query)
.enqueue(new Callback<RepoSearchResponse>() {
@Override
public void onResponse(@NonNull Call<RepoSearchResponse> call, @NonNull Response<RepoSearchResponse> response) {
repos.setValue(response.body().getItems());
}
...
});
return repos;
}
}
在ViewModel中不使用transform,我们一般会写成这样
public class RepoViewModel extends ViewModel {
...
MutableLiveData<List<Repo>> searchRepo(String query) {
// NO!
return dataModel.searchRepo(query);
}
}
这样写存在一定问题
DataModel中已经准备好了LiveData,好像ViewModel可以不用再处理,可以直接交给View,但是存在下面两个问题
- 每次
searchRepo
方法调用的时候,DataModel中都会生成新的LiveData,这样View每次针对新的LiveData用新的Observe- 当View recreate的时候,会再次调用
searchRepo
方法,导致DataModel又进行一次操作
需要使用Transformations
Transformations不会使LiveData变成新的instance,因此View一直都是对repos做observe,解决了上面提到的两个问题。
网友评论