我的服务器在一切正常时返回域 java 对象,但在出现错误时返回 ErrorResponse 对象。 (编辑:服务器返回 http 代码 40x,以及带有错误信息的 json 正文) 如何在 retrofit 2 + rx-android 上注册全局错误转换器以避免在每次调用时都做同样的事情?
目前我在每次通话时都这样做:
MyApiRx.doSomething(params)
.subscribeOn(Schedulers.io())
.subscribe(response -> responseHandler(),
throwable -> {
HttpException err = (HttpException) throwable;
Converter<ResponseBody, ErrorResponse> ec = retrofit.responseConverter(ErrorResponse.class, new Annotation[]{});
ErrorResponse errorResponse = ec.convert(err.response().errorBody());
});
也许我应该写一个自定义的 CallAdapterFactory 来自动处理这个问题,并返回一个带有 onError(ErrorResponse err) 的 Observable 而不是常规的 onError(Throwable t)?
关于如何实现这一点有什么想法吗?
这是个好主意吗?
最佳答案
Observable
有几个有趣的方法你可以使用。特别是你应该看看这两个:
onErrorResumeNext(Func1<Throwable, Observable> resumeFunction)
doOnError(Action1<Throwable> onError)
因为我没有看到(在你的例子中)需要另一个 Observable
为了获得对流的控制,后者可能更适合您。
你可以做的是创建一个类来包装你的错误处理程序(例如像这样):
public static class Response {
private static final Action1<Throwable> ERROR_HANDLER = new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
HttpException err = (HttpException) throwable;
Converter<ResponseBody, ErrorResponse> ec = retrofit.responseConverter(ErrorResponse.class, new Annotation[]{});
ErrorResponse errorResponse = ec.convert(err.response().errorBody());
}
};
public static Action1<Throwable> handleError() {
return ERROR_HANDLER;
}
}
然后调用您的 api:
MyApiRx.doSomething(params)
.subscribeOn(Schedulers.io())
.doOnError(Response.handleError())
.subscribe(response -> responseHandler());
关于android - 如何在 retrofit 2 + rx-android 上注册全局错误转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882453/