使用Retrofit observable处理网络错误

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

鉴于此代码:

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

如果没有网络,请求就会失败,并且不会调用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) 

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

我的问题实际上是我的代码中的其他地方 使用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 } } } 

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

您应该查看error handling操作符 。 最基本的选项是onErrorReturn() ,它允许您onErrorReturn()替换错误( GetJobResponse实例)。

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

请注意,如果让observable发出onError ,则所有上游可观察对象都将关闭 – 无论您是使用onErrorReturn还是onErrorResumeNext “捕获”它。 通常你不希望这样。 例如,如果您的流以单击按钮启动,则会触发失败的改装请求,因此流终止后将无法再识别按钮单击。

使用Observable>Observable>也可以处理onNext()改进错误。

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

Retrofit2RxJava2 ,不再有RetrofitErrorexception。 它的后继者HttpException仅代表HTTP错误响应代码。 网络错误应该通过IOException来处理。

  @Override public void onError(Throwable e) { if (e instanceof IOException) { //handle network error } else if (e instanceof HttpException) { //handle HTTP error response code } else { //handle other exceptions } }