当前,我使用一项服务来与retrofit
进行网络通话,但我想将此模型更新为将ViewModel
与LiveData
一起使用。我正在努力解决的问题是如何设置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}}个对象?
我的建议有意义吗?
答案 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;
}