Android架构组件

2018-09-26  本文已影响0人  tesla1984

ViewModel和LiveData-模式与反模式

改造 Android 官方架构组件 ViewModel

使用Android架构组件实现MVVM模式的应用

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,但是存在下面两个问题

  1. 每次searchRepo方法调用的时候,DataModel中都会生成新的LiveData,这样View每次针对新的LiveData用新的Observe
  2. 当View recreate的时候,会再次调用searchRepo方法,导致DataModel又进行一次操作

需要使用Transformations
Transformations不会使LiveData变成新的instance,因此View一直都是对repos做observe,解决了上面提到的两个问题。

上一篇下一篇

猜你喜欢

热点阅读