使用自定义 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()
将不会被调用。
我正在使用 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()
将不会被调用。