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

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

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

person alihabbash95    schedule 10.08.2018    source источник
comment
взгляните на bytes.babbel. ru / en / article /   -  person Raghunandan    schedule 10.08.2018


Ответы (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
});
person Tuby    schedule 10.08.2018