@terminator-light

RxJava. Почему не срабатывает данный код?

Только начал изучать RxJava и пытаюсь реализовать проверку на офлайн. Когда есть сеть, должно выдавать от ретрофита, при офлайне - из БД.
Код из Repository:
public Observable<List<Category>> getCategories() {
        return App.getInstance().isConnectionAvailable()
                .filter(connection -> connection)
                .switchMap(connection -> remoteDataSource.getCategories()
                        .doOnNext(categories -> localDataSource.insertCategories(categories)))
                .switchIfEmpty(observer -> localDataSource.getCategories());
    }

при сети работает корректно, а без сети из БД не выдает почему-то. Но при этом метод localDataSource.getCategories() вызывается.
Когда оставляю return localDataSource.getCategories() вместо тела вышеприведенного метода, данные из БД приходят и отображаются.
И вызов в презентере:
disposable.add(repository.getCategories()
                .compose(RxUtils.async()) // subscribeOn.io/observeOn
                .subscribe(view::showCategories, t -> ErrorHandler.handleError(view, t)));

При первом варианте в view::showCategories и ErrorHandler.handleError ничего не попадает, не вызываются.
В чем может быть дело?
  • Вопрос задан
  • 223 просмотра
Решения вопроса 1
@terminator-light Автор вопроса
Переделал архитектуру: чекаю сеть при получении данных из remoteDataSource. Если сети нет, кидаю ошибку. В основном репозитории делаю onErrorResumeNext, проверяю на IOException и возвращаю данные из localDataSource
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Вангую, что isConnectionAvailable() возвращает бесконечный Observable, поэтому switchIfEmpty не сработает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы