Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用LiveData和Repository安装ViewModel的正确方法_Android_Retrofit_Retrofit2_Android Livedata_Android Viewmodel - Fatal编程技术网

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;