Правильный способ настройки ViewModel с LiveData и репозитория с Retrofit - PullRequest
2 голосов
/ 24 марта 2019

В настоящее время я использую службу для сетевых вызовов с retrofit, но я хочу обновить эту модель, чтобы использовать ViewModel с LiveData. Я сталкиваюсь с тем, как настроить Repository для обновления объекта liveata.

В примерах, которые я видел, люди возвращают обернутый объект 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 из Repository?

Имеет ли смысл то, что я предлагаю?

1 Ответ

2 голосов
/ 24 марта 2019

Насколько я понял твой вопрос, ты хочешь наблюдать за изменениями в твоей жизни. для этого вы можете обратиться к 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;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...