gpt4 book ai didi

android - 如何制作 RxErrorHandlingCallAdapterFactory?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:18 25 4
gpt4 key购买 nike

我找到了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com