Мой LiveData
объект вызывается дважды, когда мой httprequest выполнен успешно, но в случае ошибки он вызывается только один раз, в результате чего пользовательский интерфейс отображает пустой список, поскольку моя проверка Error
была пропущена, так как не было предупреждения
Код моего репозитория
private LiveData<List<Card>> getCards() {
return cardsDao.getCards();
}
// Network request, that deals with the success or error of the request
public LiveData<DataWrapper<List<Card>>> loadCards() {
AtomicReference<LiveData<DataWrapper<List<Card>>>> atomicWrapper = new AtomicReference<>();
if (getCards().getValue() == null) {
webService.getCards(result -> {
CardResponse res = (CardResponse) result;
List<Card> cardList = res.getCardsList();
getInsertAsyncTask.execute(cardList.toArray(new Card[cardList.size()]));
}, error -> {
atomicWrapper.set(asLiveData(null, error.getMessage()));
}, TAG);
}
atomicWrapper.set(asLiveData(getCards(),null));
return atomicWrapper.get();
}
Код моего базового репозитория
LiveData<DataWrapper<List<T>>> asLiveData(LiveData<List<T>> dataSource, String error) {
MediatorLiveData<DataWrapper<List<T>>> mediatorLiveData = new MediatorLiveData<>();
mediatorLiveData.addSource(dataSource, data -> mediatorLiveData.setValue(new DataWrapper<>(data, error)));
return mediatorLiveData;
}
Код моего фрагмента
private void subscribeToCards() {
mViewModel.getCards().observe(this, listDataWrapper -> {
if( listDataWrapper == null ) {
return;
}
if( listDataWrapper.error != null) {
// Show error on UI
dismissProgress();
Log.e(TAG, "Error - " + listDataWrapper.error);
showError(getString(R.string.cards_error_get_list_message));
EventBus.getDefault().post(new DialogMessageEvent(getString(R.string.cards_error_get_list_title),
getString(R.string.cards_error_get_list_message), getString(R.string.cards_error_get_list_button)));
}
if( listDataWrapper.data != null ) {
// Update Ui
refreshCardsList(listDataWrapper.data);
cardsViewVisibility(true);
}
});
}
И, наконец, мой код ViewModel
public LiveData<DataWrapper<List<Card>>> getCards(){
return repository.loadCards();
}
Подводя итог, в случае сбоя, почему observer callback
вызывается только один раз?Поскольку я отлаживал его, и в обоих случаях (успешном и неудачном) метод asLiveData
называется TWICE, но только в успешной попытке обратный вызов называется TWICE aswell, а при ошибке observer callback
он вызывается толькоОДИН РАЗ.
Редактировать: добавлен код асинхронной задачи
@SuppressLint("StaticFieldLeak")
AsyncTask<T,Void,Void> getInsertAsyncTask = new AsyncTask<T, Void, Void>() {
@Override
protected Void doInBackground(T... ts) {
daoObject.insertObjects(Arrays.asList(ts));
return null;
}
};