RXJava Игнорировать ошибку и продолжить цепочку

У меня есть цепочка RXJava, где может быть сброшена ошибка. Я хотел бы, чтобы цепочка продолжала и игнорировала ошибку и достигла подписки только для некоторых конкретных ошибок.

Например, в этом коде

authDataManager .getUserAccessToken(username, password) .subscribeOn(Schedulers.io()) .doOnNext({ authDataManager.saveUserAccessToken(it) }) .flatMap { appDataManager.getStations() } .doOnNext({ appDataManager.persistStations(it) }) .flatMap { appDataManager.getDriverInformation() } .doOnNext({ appDataManager.persistDriverInformation(it) }) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { onLoginSuccess() }, { onLoginFailure(it) } ) 

если appDataManager.getStations() выдает ошибку, я все равно хочу продолжить и onLoginSuccess() метод onLoginSuccess() .

Однако, если getUserAccessToken(username, password) терпит неудачу, следует вызвать onLoginFailure .

Я попытался добавить onErrorResumeNext () и onExceptionResumeNext () после плоских карт и внутри них, но если я это сделаю, цепочка просто выйдет и не продолжит и не достигнет подписки

Я думаю, вы можете использовать оператор onErrorResumeNext .

  authDataManager .getUserAccessToken(username, password) .subscribeOn(Schedulers.io()) .doOnNext({ authDataManager.saveUserAccessToken(it) }) .flatMap { appDataManager.getStations() .onErrorResumeNext(Observable.empty()) } .doOnNext({ appDataManager.persistStations(it) }) .flatMap { appDataManager.getDriverInformation() } .doOnNext({ appDataManager.persistDriverInformation(it) }) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { onLoginSuccess() }, { onLoginFailure(it) } ) 

Стоя на плечах ответа @ savepopulation и используя наблюдение, что у вас есть три различные цепи наблюдателей:

  authDataManager .getUserAccessToken(username, password) .subscribeOn(Schedulers.io()) .doOnNext({ authDataManager.saveUserAccessToken(it) }) .doOnNext( appDataManager.getStations() .onErrorResumeNext(Observable.empty()) .subscribe( appDataManager.persistStations(it) ) ) .doOnNext( appDataManager.getDriverInformation() .subscribe( appDataManager.persistDriverInformation(it) ) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { onLoginSuccess() }, { onLoginFailure(it) } ) 

Основная цепочка наблюдателей заканчивается, а две вспомогательные сети вообще не участвуют в журнале; они просто запускаются, получая токен доступа пользователя.

Если вам нужны эти вспомогательные ветви для асинхронной работы в основной цепочке, вам нужно будет добавить операторы subscribeOn() / observeOn() .

Я понял это в Kotlin здесь (ссылка stackoverflow)

Это можно сделать, используя комбинацию отображения, фильтрации, опций и onErrorResumeNext . Я думаю, что это примерно так же изящно, как и в текущей версии RxJava.

 authDataManager .getUserAccessToken(username, password) .subscribeOn(Schedulers.io()) .doOnNext({ authDataManager.saveUserAccessToken(it) }) .flatMap { appDataManager.getStations() .map(stations -> Single.just(Optional.of(stations)) .onErrorResumeNext(error -> Single.just(Optional.empty())) } .filter(optional -> optional.isPresent()) .map(stations -> optional.get()) .doOnNext({ appDataManager.persistStations(it) }) .flatMap { appDataManager.getDriverInformation() } .doOnNext({ appDataManager.persistDriverInformation(it) }) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { onLoginSuccess() }, { onLoginFailure(it) } ) 
Intereting Posts
Котлин, как получить значение поля через отражение Как использовать анонимные классы Kotlin в качестве аргументов для собственных функций JavaScript? Android Studio 3 версия Kotlin Kotlin: Как я могу избежать дублирования кода в конструкторах? Как вы определяете команды компиляции, выпущенные IntelliJ Idea? Как создать переменную функции с переменным числом аргументов? Проблемы с переходом от фрагментатора / MapFragment к supportfragmentManager / SupportMapFragment Каковы ограничения на динамическую / двойную отправку в Котлин? В чем разница между () -> единицей и (единицей) -> типами единиц? Parceler: невозможно найти генератор чтения / записи для типа io.realm.RealmList Как применить метод запуска / остановки звука с помощью ToggleButton? Spring Data JPA Как использовать ноль Kotlin вместо необязательного Проверка общего типа метода Котлина Может ли ковариантный параметр типа находиться во входной позиции в конструкторе? Безусловная инфляция макета из адаптера просмотра. Котлин