Observable.concat

203
15 марта 2018, 09:28

Имеется 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 сработал?

Answer 1

Необходимо добавить 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);
}
READ ALSO
Как выделенный текст обернуть в тэг?

Как выделенный текст обернуть в тэг?

Есть простой текст в div-блокеКак при выделении фрагмента этого текста обернуть его в тэг ? Или как сделать то же самое, но при клике на кнопку,...

214
IE игнорирует oncontextmenu

IE игнорирует oncontextmenu

Всем привет! Решил запретить контекстное меню браузеров на сайте использовал

200
Java Set (hash set, tree set) вывод из servlet на страницу

Java Set (hash set, tree set) вывод из servlet на страницу

Есть класс EchoServlet c простой html формой заполнения (ФИО и тд

224
Как прижать навбар вниз главного экрана

Как прижать навбар вниз главного экрана

Но при прокрутки вниз оставался фиксированным наверху ,скиньте примеры простые

234