Имеется 2 источника данных: БД и сервер. При старте приложения вызывается следующий метод репозитория (MyRepository):
public Observable<List<MyObj>> fetchMyObjs() {
Observable<List<MyObj>> localData = mLocalDataSource.fetchMyObjs();
Observable<List<MyObj>> remoteData = mRemoteDataSource.fetchMyObjs();
return Observable.concat(localData, remoteData);
}
Подписываюсь на него следующим образом:
mMyRepository.fetchMyObjs()
.compose(applySchedulers())
.subscribe(
myObjs -> {
//do somthing
},
throwable -> {
//handle error
}
);
Я ожидаю, что данные из БД подгрузятся быстрей, а когда завершится загрузка данных из сети, я просто обновлю данные в Activity.
При подключенной сети Интернет все отрабатывает хорошо. Но когда открываем приложение без подключения к сети, то mRemoteDataSource.fetchMyObjs();
кидает UnknownHostException и на этом все Observable'ы завершаются (подписчик для localData не отрабатывает (хотя логи показывают, что данные из БД были взяты)). И когда я пытаюсь заново вызвать метод fetchMyObjs()
из класса MyRepository
(через SwipeRefresh), то подписчик на localData срабатывает.
Как можно добиться того, чтобы при отключенной сети при старте приложения подписчик на localData сработал?
Необходимо добавить retry(throwable -> true)
В таком случае, если в каком-то произойдёт ошибка для этого элемента, то последующая цепочка не сработает, в том числе onError
в subscribe
.
Если retry
добавить для mRemoteDataSource.fetchMyObjs()
, то ошибка будет проигнорирована только для этого Observable. Если добавить после Observable.concat
то ошибки из базы и/или из сети будут проигнорированы.
В вашем случае, если ошибка от сети не волнует, но нужно получить другие ошибки в subscribe
, то можно сделать следующим образом:
public Observable<List<MyObj>> fetchMyObjs () {
Observable<List<MyObj>> localData = mLocalDataSource.fetchMyObjs();
Observable<List<MyObj>> remoteData = mRemoteDataSource.fetchMyObjs()
.retry(throwable -> throwable instanceof IOException);
return Observable.concat(localData, remoteData);
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть простой текст в div-блокеКак при выделении фрагмента этого текста обернуть его в тэг ? Или как сделать то же самое, но при клике на кнопку,...
Всем привет! Решил запретить контекстное меню браузеров на сайте использовал
Есть класс EchoServlet c простой html формой заполнения (ФИО и тд
Но при прокрутки вниз оставался фиксированным наверху ,скиньте примеры простые