在使用具有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
}
});
请求在没有网络的情况下会失败,并且不会调用onError。它不会崩溃,但会静悄悄地失败。Logs显示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)
使用回调,这将简单地传递给onFailure(RetrofitError错误)。我怎样才能让这个用RxJava浮出水面呢?
发布于 2014-08-11 21:42:18
我的问题实际上出在代码的其他地方。使用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
}
}
}
发布于 2014-08-09 21:59:22
这纯粹是一个RxJava问题,不涉及那么多来自Retrofit的问题。doOnError
是一个副作用,所以即使它处理了错误,它也不能在防止错误向前冒泡的意义上“捕获”它。
你应该看看Error Handling Operators。最基本的选项是onErrorReturn()
,它允许您用一个项目(GetJobResponse
的实例)替换一个错误。
您可以在该项目上设置"error“标志,以便以后订阅observable
时进行识别。同样重要的是要知道,如果你不订阅该可观察对象,它本质上是“死的”。您应该始终订阅可观察性,而不是使用"doOn___“,这只是副作用(应该用于日志记录和其他非关键功能)。
发布于 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/
https://stackoverflow.com/questions/25213057
复制相似问题