Android 改装不';使用自定义ErrorHandler时,不会触发onError
我正在使用改进版1.9.0、RxJava1.0.10、Rxandroid0.24.0和OKHTTP2.4.0。设置自定义ErrorHandler时,不会触发RxJava订户方法。为什么?有可能改变这种行为吗 我正在附上源代码 初始化: HttpClient:Android 改装不';使用自定义ErrorHandler时,不会触发onError,android,retrofit,rx-java,Android,Retrofit,Rx Java,我正在使用改进版1.9.0、RxJava1.0.10、Rxandroid0.24.0和OKHTTP2.4.0。设置自定义ErrorHandler时,不会触发RxJava订户方法。为什么?有可能改变这种行为吗 我正在附上源代码 初始化: HttpClient: OkHttpClient httpClient = new OkHttpClient(); httpClient.setHostnameVerifier(...); // allow all try { httpClient.se
OkHttpClient httpClient = new OkHttpClient();
httpClient.setHostnameVerifier(...); // allow all
try {
httpClient.setSslSocketFactory(...);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
重新适应:
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create();
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(BASE_API_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(httpClient)
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept-Language", Locale.getDefault().getLanguage());
}
})
.setConverter(new GsonConverter(gson))
.setErrorHandler(new CustomErrorHandler(this))
.build();
Api api = restAdapter.create(Api.class);
自定义错误处理程序:
public class CustomErrorHandler implements ErrorHandler {
private final Context mContext;
public UniversalErrorHandler(Context context) {
mContext = context;
}
@Override
public Throwable handleError(RetrofitError cause) {
String errorMessage;
if (cause.getKind() == RetrofitError.Kind.NETWORK) {
errorMessage = mContext.getString(R.string.no_network_connection);
} else {
if (cause.getResponse() == null || cause.getResponse().getStatus() == 500) {
errorMessage = mContext.getString(R.string.error_contacting_server);
} else {
errorMessage = mContext.getString(R.string.unknown_error);
}
}
return new Exception(errorMessage, cause);
}
}
用法:
Observable<List<Object>> observable = api.getObjects();
observable
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Object>>() {
@Override
public void onCompleted() {
Timber.i("onCompleted");
}
@Override
public void onError(Throwable e) {
Timber.e(e, "onError");
}
@Override
public void onNext(List<Object> objects) {
Timber.i("onNext %d", objects.size());
}
});
Observable-Observable=api.getObjects();
可观察
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
木材。i(“未完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
木材。e(e,“onError”);
}
@凌驾
public void onNext(列出对象){
Timber.i(“onNext%d”,objects.size());
}
});
我从代码列表中删除了这一行:
Timber.e("Error: %s, %d", cause.getMessage(), cause.getResponse().getStatus());
getStatus()
正在导致NullPointerException
,因为响应为空。。。我忽略了它,因为logcat中没有任何日志
如果从
handleError()
方法引发运行时异常,将不会调用onError()
。我不知道您的问题,但我想我应该提到rxjava现在处于1.0.12,具有不同的组和工件ID。那个版本背后有很多错误修复。@davem-编辑了我的答案。我使用的是RxAndroid 0.24.0和RxJava 1.0.10。您如何知道发生了错误?你能模拟一下吗?我正在使用一个带有改型和RxJava的自定义ErrorHandler,它工作得很好。我怀疑您的代码可能有其他问题。这可能是线程问题吗?如果在使用部分中删除.subscribeOn(Schedulers.newThread())
,这会改善情况吗?改型将在内部将线程切换到后台线程,因此无需手动.subscribeOn
,只需调用改型即可