Android 改装不';使用自定义ErrorHandler时,不会触发onError

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

我正在使用改进版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.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
,只需调用改型即可