使用rxjava正确处理所有类型的Retrofit错误

时间:2018-08-10 13:27:28

标签: android retrofit2 rx-java2 rx-binding

我是Rxjava的{​​{1}}的新手,我正在寻求最好的正确方法来使用Retrofitrxjava处理翻新中的所有可能状态,其中包括:

  1. 没有互联网连接。
  2. 服务器无响应。
  3. 成功的反应。
  4. 错误响应并显示错误消息,例如rxbinding
  5. 其他错误,例如Username or password is incorrect

1 个答案:

答案 0 :(得分:2)

每个重要的故障响应都有异常子类。 异常以Observable.error()的形式传递,而值通过流的形式传递而没有任何包装。

1)没有互联网-ConnectionException

2)Null-仅NullPointerException

4)检查“错误请求”并抛出IncorrectLoginPasswordException

5)其他任何错误都只是NetworkException

您可以使用onErrorResumeNext()map()来映射错误

例如

从Web服务中获取数据的典型改装方​​法:

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
});