Имеется 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);
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости