使用Obtrables with Retrofit时如何处理网络故障?
鉴于此代码:
Observableobservable = 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
是副作用,因此即使它处理错误,它也不会"防止"它阻止它向前冒泡.
您应该查看错误处理操作符.最基本的选项是onErrorReturn()
允许您用项(实例GetJobResponse
)替换错误.
您可以在该项目上添加"错误"标志,以便以后在订阅时识别它observable
.同样重要的是要知道,如果你不订阅那个可观察的,它基本上是"死的".您应该始终订阅observable而不是使用"doOn___",它们只是副作用(应该用于记录和其他非关键功能).