我找到了 this .
但在新版本中compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0'
在 CallAdapter 它有两个参数
CallAdapter<?,?>
如何修改RxCallAdapterWrapper至 implement
如果来自 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/