处理networking错误与改造可观察

将Observable与Retrofit结合使用时,如何处理networking故障?

鉴于此代码:

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

请求只是失败,没有networking和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) 

使用callback,这只是传递给onFailure(RetrofitError错误)。 我怎样才能使用RxJava浮出水面?

Solutions Collecting From Web of "处理networking错误与改造可观察"

我的问题其实在我的代码中的其他地方。 使用rxJava + Retrofit处理networking错误非常简单,因为它只是在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操作符 。 最基本的select是onErrorReturn() ,它允许你用一个项目( GetJobResponse实例)replace一个错误。

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

请注意,如果让一个observable发出onError ,那么所有的上游observable都会closures – 无论是用onErrorReturn还是onErrorResumeNext “捕获”它。 通常你不需要这个。 例如,如果您的stream开始于点击button,触发了一个失败的翻新请求,那么由于stream终止,button点击将不再被识别。

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

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

至于Retrofit2RxJava2 ,没有更多的RetrofitErrorexception。 而它的后继HttpException只表示HTTP错误响应代码。 networking错误应该通过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 } }