android – 使用自定义ErrorHandler时,Retrofit不会触发onError

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

我附上了源代码.

初始化:

HttpClient的:

OkHttpClient httpClient = new OkHttpClient();
httpClient.setHostnameVerifier(...); // allow all

try {
    httpClient.setSslSocketFactory(...);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
    e.printStackTrace();
}

RestAdapter:

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

自定义ErrorHandler:

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 one rror(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,因为响应为null …我忽略了它,因为logcat中没有任何日志.

如果从handleError()方法抛出运行时异常,则不会调用onError().

上一篇:Redis搭建高可用集群


下一篇:错误decodin签名JWT身份验证Android