使用Retrofit observable处理网络错误

Pat*_*ick 20 android observable rx-java retrofit

使用Obtrables with Retrofit时如何处理网络故障?

鉴于此代码:

Observable<GetJobResponse> observable = api.getApiService().getMyData();
observable
    .doOnNext(new Action1<GetJobResponse>() {
        @Override
        public void call(GetJobResponse getJobResponse) {
            //do stuff with my data
        }
    })
    .doOnError(new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {
            //do stuff with error message
        }
    });
Run Code Online (Sandbox Code Playgroud)

如果没有网络,请求就会失败,并且不会调用onError.它不会崩溃,但会无声地失败.日志显示Retrofit获取错误:

 java.net.UnknownHostException: Unable to resolve host "api-staging.sittercity.com": No address associated with hostname
     at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
     at java.net.InetAddress.getAllByName(InetAddress.java:214)
     at com.squareup.okhttp.internal.Dns$1.getAllByName(Dns.java:29)
Run Code Online (Sandbox Code Playgroud)

使用回调,这只是传递给onFailure(RetrofitError错误).如何使用RxJava浮出水面?

Pat*_*ick 33

我的问题实际上是我的代码中的其他地方 使用rxJava + Retrofit处理网络错误非常简单,因为它只是在onError方法中引发了一个RetrofitError:

 @Override
 public void onError(Throwable e) {
     if (e instanceof RetrofitError) {
        if (((RetrofitError) e).isNetworkError()) {
            //handle network error
        } else {
            //handle error message from server
        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

  • 如果使用Retrofit 2,它将是`retrofit.HttpException`而不是`RetrofitError` (17认同)
  • `.NisError()`现在已折旧.现在使用`getKind()== Kind.NETWORK`.https://square.github.io/retrofit/javadoc/retrofit/RetrofitError.html但除此之外,谢谢! (4认同)

And*_*ltz 12

这纯粹是一个RxJava问题,并没有涉及Retrofit那么多.doOnError是副作用,因此即使它处理错误,它也不会"防止"它阻止它向前冒泡.

您应该查看错误处理操作符.最基本的选项是onErrorReturn()允许您用项(实例GetJobResponse)替换错误.

您可以在该项目上添加"错误"标志,以便以后在订阅时识别它observable.同样重要的是要知道,如果你不订阅那个可观察的,它基本上是"死的".您应该始终订阅observable而不是使用"doOn___",它们只是副作用(应该用于记录和其他非关键功能).