android - 如何制作 RxErrorHandlingCallAdapterFactory?

标签 android error-handling rx-java retrofit2 rx-android

我找到了 this .

但在新版本中compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0'在 CallAdapter 它有两个参数 CallAdapter<?,?>

如何修改RxCallAdapterWrapperimplement如果来自 CallAdapter<?,?>

最佳答案

免责声明:我是您引用的博文的作者

原来的帖子是作为概念证明和 RxJava 2 的,所以我也更容易用那个版本来解释,但我会尝试覆盖更多的领域。我猜您使用的是版本 1,因为您谈论的是 adapter-rxjava而不是 adapter-rxjava2 .也就是说,版本 1 的实现应该非常简单,只需使用正确的导入即可。

这是我使用 RxJava 2 所做的:

class RxErrorHandlingCallAdapterFactory extends CallAdapter.Factory {
  private final RxJava2CallAdapterFactory original;

  private RxErrorHandlingCallAdapterFactory() {
    original = RxJava2CallAdapterFactory.create();
  }

  public static CallAdapter.Factory create() {
    return new RxErrorHandlingCallAdapterFactory();
  }

  @Override
  public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
    return new RxCallAdapterWrapper(retrofit, original.get(returnType, annotations, retrofit));
  }

  private static class RxCallAdapterWrapper<R> implements CallAdapter<R, Object> {
    private final Retrofit retrofit;
    private final CallAdapter<R, Object> wrapped;

    public RxCallAdapterWrapper(Retrofit retrofit, CallAdapter<R, Object> wrapped) {
        this.retrofit = retrofit;
        this.wrapped = wrapped;
    }

    @Override
    public Type responseType() {
        return wrapped.responseType();
    }

    @Override
    public Object adapt(Call<R> call) {
        Object result = wrapped.adapt(call);
        if (result instanceof Single) {
            return ((Single) result).onErrorResumeNext(new Function<Throwable, SingleSource>() {
                @Override
                public SingleSource apply(@NonNull Throwable throwable) throws Exception {
                    return Single.error(asRetrofitException(throwable));
                }
            });
        }
        if (result instanceof Observable) {
            return ((Observable) result).onErrorResumeNext(new Function<Throwable, ObservableSource>() {
                @Override
                public ObservableSource apply(@NonNull Throwable throwable) throws Exception {
                    return Observable.error(asRetrofitException(throwable));
                }
            });
        }

        if (result instanceof Completable) {
            return ((Completable) result).onErrorResumeNext(new Function<Throwable, CompletableSource>() {
                @Override
                public CompletableSource apply(@NonNull Throwable throwable) throws Exception {
                    return Completable.error(asRetrofitException(throwable));
                }
            });
        }

        return result;
    }

    private RetrofitException asRetrofitException(Throwable throwable) {
        // We had non-200 http error
        if (throwable instanceof HttpException) {
            HttpException httpException = (HttpException) throwable;
            Response response = httpException.response();
            return RetrofitException.httpError(response.raw().request().url().toString(), response, retrofit);
        }
        // A network error happened
        if (throwable instanceof IOException) {
            return RetrofitException.networkError((IOException) throwable);
        }

        // We don't know what happened. We need to simply convert to an unknown error

        return RetrofitException.unexpectedError(throwable);
    }
  }
}

没有重大变化,只是对返回类型进行了一些调整。现在,如果您查看 RxJava2CallAdapter它实现了 CallAdapter<R, Object> ,所以我们需要考虑这一点。

然后我为实例类型添加了一些检查以确保我们返回正确的东西。

真正重要的部分是确保导入正确的包。改造适配器检查特定类。我遇到的一个问题是导入错误,并且我正在检查 Throwable 是否存在。是 com.jakewharton.retrofit2.adapter.HttpException 的实例, 而它实际上是 retrofit2.adapter.rxjava2.HttpException 的一个实例.

希望对你有帮助

关于android - 如何制作 RxErrorHandlingCallAdapterFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43225556/

相关文章:

php - 在发送请求之前,PHP是否针对WSDL验证请求?

java - RxJava BehaviorSubject 没有发出最后一项?

android - 在 Android 中使用 RxJava、OkHttp 和 Okio 下载进度

android - 如何从 SeekBar 的 onProgressChanged 代码调用?

java - Apache FTP客户端 : 530 You aren't logged in

python - 'NoneType' 对象没有属性 'shape'

java - 如何在 RxJava 中让多个订阅者订阅一个分组的 Observable?

android - 尽管有投影,谷歌地图仍绘制正方形

android - 如何重叠 View ?

php - xampp错误报告