обратный вызов не работает должным образом после данных onResponse - PullRequest
0 голосов
/ 18 мая 2019

У меня есть этот метод

 private void setNews(final GetDataCallback getDataCallback){
    GetDataService service = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);
    Call<ItemsAPI> call = service.getAllItems();
    call.enqueue(new Callback<ItemsAPI>() {
        @Override
        public void onResponse(Call<ItemsAPI> call, Response<ItemsAPI> response) {
            if (response.isSuccessful()) {
                Log.d(TAG, "onResponse");
                items = response.body();
                getDataCallback.onGetData(items.getItems());
            }
            else {
                getDataCallback.onError();
            }
        }

        @Override
        public void onFailure(Call<ItemsAPI> call, Throwable t) {
            getDataCallback.onError();
            Log.d(TAG, "onFailure "+ t.getMessage());
        }
    });
}

где я получаю колбол с информацией из API И мне нужно передать эту информацию другому колболу

 public MutableLiveData<List<News>> getNews(){
    setNews(new GetDataCallback() {
        @Override
        public void onGetData(List<News> newsData) {
            dataSet = newsData;
            Log.d(TAG, "size: "+dataSet.size());
        }

        @Override
        public void onError() {

        }
    });
    MutableLiveData<List<News>> data = new MutableLiveData<>();
    Log.d(TAG, "size before setValue: "+dataSet.size());
    data.setValue(dataSet);
    return data;
}

Когда я проверяю журнал, я вижу

2019-05-18 10:45:17.575 2250-2250/? D/NewsRepository: size before setValue: 0

2019-05-18 10:45:18.334 2250-2250/com.krasnov.rxjavalearning D/NewsRepository: onResponse

2019-05-18 10:45:18.334 2250-2250/com.krasnov.rxjavalearning D/NewsRepository: size: 30

Из другого класса я вызываю метод getNews (). Мне нужно сделать setNews () сначала, иметь элементы в наборе данных и после возвращаемого значения из getNews ().

Как я могу это сделать?

1 Ответ

0 голосов
/ 18 мая 2019

Retrofit.enqueue () является асинхронным вызовом и выполняется в будущем.

Если вы хотите обновить интерфейс из Livedata из getNews ()

LiveData<Data> getNews() {

final MutableLiveData<Data> data = new MutableLiveData<>();

setNews( new MyCallback(){

 Void onSuccess(Data data){

data.setValue(data); // for success live data get call back
} 
void onError(){
 data.setValue(null); // for error case can pass null or empty list
}
});

return data;
}

Вы получите обновление с ответом

...