首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Retrofit observable处理网络错误

使用Retrofit observable处理网络错误
EN

Stack Overflow用户
提问于 2014-08-09 06:18:40
回答 4查看 19K关注 0票数 24

在使用具有Retrofit的观察点时,您如何处理网络故障?

给定以下代码:

代码语言:javascript
复制
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
        }
    });

请求在没有网络的情况下会失败,并且不会调用onError。它不会崩溃,但会静悄悄地失败。Logs显示Retrofit收到错误:

代码语言:javascript
复制
 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)

使用回调,这将简单地传递给onFailure(RetrofitError错误)。我怎样才能让这个用RxJava浮出水面呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-11 21:42:18

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

代码语言:javascript
复制
 @Override
 public void onError(Throwable e) {
     if (e instanceof RetrofitError) {
        if (((RetrofitError) e).isNetworkError()) {
            //handle network error
        } else {
            //handle error message from server
        }
     }
 }
票数 34
EN

Stack Overflow用户

发布于 2014-08-09 21:59:22

这纯粹是一个RxJava问题,不涉及那么多来自Retrofit的问题。doOnError是一个副作用,所以即使它处理了错误,它也不能在防止错误向前冒泡的意义上“捕获”它。

你应该看看Error Handling Operators。最基本的选项是onErrorReturn(),它允许您用一个项目(GetJobResponse的实例)替换一个错误。

您可以在该项目上设置"error“标志,以便以后订阅observable时进行识别。同样重要的是要知道,如果你不订阅该可观察对象,它本质上是“死的”。您应该始终订阅可观察性,而不是使用"doOn___“,这只是副作用(应该用于日志记录和其他非关键功能)。

票数 12
EN

Stack Overflow用户

发布于 2017-03-15 23:59:15

请注意,如果您让一个可观测对象发出onError,则所有上游可观测对象都将关闭-无论您是使用onErrorReturn还是onErrorResumeNext“捕获”它。通常情况下,您并不希望这样。例如,如果您的流从一个按钮点击开始,该按钮点击触发了一个失败的改造请求,那么该按钮点击将不再被识别,因为流终止了。

还可以使用Observable<Response<Type>>Observable<Result<Type>>来处理onNext()中的改装错误。

s. http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25213057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档