使用自定义 ErrorHandler 时改造不会触发 onError

Retrofit doesn't trigger onError when using custom ErrorHandler

我正在使用 Retrofit 1.9.0、RxJava 1.0.10、RxAndroid 0.24.0 和 OkHttp 2.4.0。当我设置自定义 ErrorHandler RxJava Subscriber 方法时,不会触发。为什么?是否可以改变这种行为?

我附上源代码。

初始化:

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

我从代码清单中删除了这一行:

Timber.e("Error: %s, %d", cause.getMessage(), cause.getResponse().getStatus());

getStatus() 导致 NullPointerException,因为响应为空...我忽略了它,因为 logcat 中没有任何登录。

如果从 handleError() 方法抛出运行时异常,

onError() 将不会被调用。