android - 如何在 retrofit 2 + rx-android 上注册全局错误转换器?

标签 android retrofit rx-java rx-android retrofit2

我的服务器在一切正常时返回域 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/

相关文章:

Android:带参数的 Http post 不起作用

Android 忽略我的 setWidth() 和 setHeight()

retrofit - 如何使用改造和 rxjava 取消任务

rx-java - RxJava中Observable、Completable和Single之间有什么区别

android - 使用 Retrofit 2.0 和 RxJava 获取响应状态码

rx-java - RxJava - flatmap vs concatMap - 为什么在订阅时订购相同?

android - 通过布局上的 80 多个 View 增强应用程序性能

java - 按标签搜索 FlickR 照片

android - Activity 的 TextView 为空

java - Android javac和dx——麻烦处理,类名和路径不匹配