Бросая исключение в onNext вложенного Flowable вызывает UndeliverableException - PullRequest
0 голосов
/ 13 января 2019

У меня есть такой код в хранилище:

return Completable.fromAction {
    // Some code
    loginService.login(id)
        .subscribe(
            { response ->
                if(response.isNotSuccessful()) {
                    throw Exception()
                }
                // Some code
            },
            { e ->
                throw e
            }
    )
}

У меня есть такой код в ViewModel:

fun onLoginAction(id) {
    repository.login(id)
        .subscribe(
            {
                showSuccess()
            },
            {
                showFailure()
            }
    )
}

По сути, ViewModel вызывает метод входа в систему в хранилище, который возвращает Completable.

Это приводит к UndeliverableException, когда ответ не успешен. Я хочу, чтобы метод onError() подписчика Completable был вызван. Как мне это сделать?

1 Ответ

0 голосов
/ 13 января 2019

У меня недостаточно знаний, чтобы сказать это с уверенностью, но я все еще думаю, что это имеет какое-то значение для вас, и оно слишком велико для комментария.

Вот что я думаю, что происходит. Когда onError терпит неудачу, rx не будет проходить через тот же наблюдаемый поток. Вместо этого он распространит это на обработчик ошибок RxPlugins и в конечном итоге на обработчик исключений по умолчанию в вашей системе. Вы можете найти это здесь .

Это означает, что когда loginService.login(id) выдает исключение в onError, поток Completable не сможет его перехватить и перенаправить на onError внешней подписки. Другими словами, завершаемый поток не зависит от службы входа в систему.

Обычно вы хотите создать один отдельный поток и позволить модели представления подписаться на него. Если у вас более одного потока, у rx есть множество операторов, которые помогут вам их объединить. Попробуйте сделать так, чтобы репозиторий возвращал один поток из сервиса. Примерно так:

fun login(id) = loginService.login(id)

А теперь на модели представления вы можете проверить, был ли вызов успешным или нет, используя тот же метод - response.isNotSuccessful()

...