正确设置带有LiveData的ViewModel和带有翻新的存储库的正确方法

时间:2019-03-24 16:20:09

标签: android retrofit retrofit2 android-livedata android-viewmodel

当前,我使用一项服务来与retrofit进行网络通话,但我想将此模型更新为将ViewModelLiveData一起使用。我正在努力解决的问题是如何设置Repository来更新livedata对象。

在我所看到的示例中,人们在存储库中返回一个类似LiveData的包装对象

public LiveData<NewsResponse> getData(){
 final MutableLiveData<DataResponse> data = new MutableLiveData<>();
    apiService.getData().enqueue(new Callback<DataResponse>() {

        @Override
        public void onResponse(Call<DataResponse> call, Response<DataResponse> response){

            if (response.isSuccessful()){
                data.setValue(response.body());
            }
        }

        @Override
        public void onFailure(Call<DataResponse> call, Throwable t) {
            data.setValue(null);
        }
    });
    return data;
}

然后他们会ViewModel

private MutableLiveData<DataResponse> dataResponse = new MutableLiveData();
private Repository repository;

public PopularGamesViewModel(@NonNull Application application) {
    repository = new Repository();
    dataResponse = repository.getData();
}

public MutableLiveData<DataResponse> getData(){
    return dataResponse;
}

然后在Activity他们会做的地方

viewModel.getData().observe(this, dataResponse -> {
        if (dataResponse != null)
        {
            // Do something
        }
    });

这对我来说似乎是错误的事情是,无论何时我想从存储库中获取新的/更新的数据时,都会创建一个新的LiveData对象,因此以前的观察者将无法再使用,因此我还必须设置观察者又对吗?

如何设置它,以便不断观察LiveData对象,然后从ViewModel调用存储库以获取任何新数据,然后ViewModel更新{ LiveData中的{1}}个对象?

我的建议有意义吗?

1 个答案:

答案 0 :(得分:2)

据我所知,您想观察实时数据的变化。为此,您可能要参考MediatorLiveData。

 public LiveData<PagedList<FooPojoList>> liveData;
 private MediatorLiveData<PagedList<FooPojoList>> mediatorLiveData;
 public FooListViewModel(@NonNull Application application) {
super(application);
mediatorLiveData=new MediatorLiveData<>();

}
public MediatorLiveData<PagedList<FooPojoList>> init(FooDao fooeDao,FooFrom foofrom,String orderBy) {
liveData = new LivePagedListBuilder(fooDao.getAllFooList(sqliteQuery), PAGE).build();
    mediatorLiveData.addSource(liveData, new Observer<PagedList<FooPojoList>>() {
        @Override
        public void onChanged(@Nullable PagedList<FooPojoList> fooListPojos) {
            mediatorLiveData.setValue(fooListPojos);
        }
    });
return mediatorLiveData;

}