Android 使用LiveData和Repository安装ViewModel的正确方法
目前,我使用一项服务通过Android 使用LiveData和Repository安装ViewModel的正确方法,android,retrofit,retrofit2,android-livedata,android-viewmodel,Android,Retrofit,Retrofit2,Android Livedata,Android Viewmodel,目前,我使用一项服务通过改造进行网络呼叫,但我想将此模型更新为使用ViewModel和LiveData。我正在努力解决的问题是如何设置存储库来更新livedata对象 在我看到的示例中,人们在存储库中返回一个LiveData包装的对象,如下所示 public LiveData<NewsResponse> getData(){ final MutableLiveData<DataResponse> data = new MutableLiveData<>();
改造
进行网络呼叫,但我想将此模型更新为使用ViewModel
和LiveData
。我正在努力解决的问题是如何设置存储库来更新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.getData().observe(this, dataResponse -> {
if (dataResponse != null)
{
// Do something
}
});
我觉得不对的是,每当我想从存储库中获取新的/更新的数据时,就会创建一个新的LiveData
对象,这样以前的观察者就不能再工作了,所以我还必须再次正确设置观察者
如何设置它,使您只需不断观察LiveData
对象,然后从ViewModel
调用存储库获取任何新数据,然后ViewModel
从存储库更新LiveData
对象
我的建议有意义吗?据我所知,您想观察livedata中的变化。为此,您可能需要参考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;
public-LiveData-LiveData;
私有中介livedata中介livedata;
公共视图模型(@NonNull应用程序){
超级(应用);
mediatorLiveData=新的mediatorLiveData();
}
公共中介livedata init(FooDao-fooeDao、FooFrom-FooFrom、字符串orderBy){
liveData=新的LivePagedListBuilder(fooDao.getAll傻瓜列表(sqliteQuery),PAGE.build();
mediatorLiveData.addSource(liveData,newobserver()){
@凌驾
更改后的公共void(@Nullable PagedList DoulistPojos){
mediatorLiveData.setValue(doulistpojos);
}
});
返回数据;
}“每当我想从存储库中获取新的/更新的数据时,都会创建一个新的LiveData对象,这样以前的观察者就不能再工作了,所以我还必须再次正确设置观察者?”--是的。这在某些情况下是合适的。例如,如果这不是getData()
,而是getdataforthisSpecificScenariosuchaseArchTerm()
,那么您很可能希望拥有“一次性的”LiveData
对象。对于原始请求的结果可能会得到更新,并且您希望将这些更新提供给现有的观察者的情况,Jiten建议的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;