簡體   English   中英

使用 LiveData 和 Retrofit 設置 ViewModel 的正確方法

[英]Proper way to setup ViewModel with LiveData and Repository with Retrofit

目前,我使用一項服務通過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調用存儲庫以獲取任何新數據,然后ViewModelRepository更新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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM