Правильно обрабатывайте все типы ошибок модернизации с помощью rxjava

Я новичок в Rxjava с Retrofit, и я спрашиваю, как лучше всего справиться со всем возможным статусом в Retrofit с использованием rxjava и rxbinding, который включает:

  1. Нет соединения с интернетом.
  2. Нулевой ответ от сервера.
  3. Успешный ответ.
  4. Ответ об ошибке и отображение сообщения об ошибке, например Username or password is incorrect.
  5. Другие ошибки, такие как connection reset by peers.

посмотрите bytes.babbel.com/en/articles/…

Raghunandan 10.08.2018 15:37
4
1
1 752
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня есть подкласс исключения для каждого важного ответа на сбой. Исключения доставляются как Observable.error(), а значения доставляются через поток без какой-либо упаковки.

1) Нет интернета - ConnectionException

2) Null - просто NullPointerException

4) Проверьте "неверный запрос" и выбросите IncorrectLoginPasswordException.

5) любая другая ошибка - это просто исключение NetworkException

Вы можете сопоставить ошибки с onErrorResumeNext() и map()

Например

Типичный метод модернизации, который извлекает данные из веб-службы:

public Observable<List<Bill>> getBills() {
    return mainWebService.getBills()
            .doOnNext(this::assertIsResponseSuccessful)
            .onErrorResumeNext(transformIOExceptionIntoConnectionException());
}

Метод, который гарантирует, что ответ в порядке, в противном случае выдает соответствующие исключения

private void assertIsResponseSuccessful(Response response) {
    if (!response.isSuccessful() || response.body() == null) {
        int code = response.code();
        switch (code) {
            case 403:
                throw new ForbiddenException();
            case 500:
            case 502:
                throw new InternalServerError();
            default:
                throw new NetworkException(response.message(), response.code());
        }

    }
}

IOException означает, что нет сетевого подключения, поэтому я выбрасываю ConnectionException

private <T> Function<Throwable, Observable<T>> transformIOExceptionIntoConnectionException() {
    // if error is IOException then transform it into ConnectionException
    return t -> t instanceof IOException ? Observable.error(new ConnectionException(t.getMessage())) : Observable.error(
            t);
}

Для вашего запроса на вход создайте новый метод, который будет проверять, в порядке ли логин / пароль.

И в конце есть

subscribe(okResponse -> {}, error -> {
// handle error
});

Другие вопросы по теме