我找到了this。
但是在CallAdapter的新版本compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0'
中,它有两个参数CallAdapter<?,?>
如果是implement
,如何将RxCallAdapterWrapper修改为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>
,因此我们需要考虑这一点。然后,我为实例类型添加了一些检查,以确保我们返回的是正确的东西。
真正重要的部分是确保您导入正确的软件包。 retrofit 适配器检查特定的类别。我遇到的一个问题是导入错误,并且遇到了一些情况,我正在检查
Throwable
是否是com.jakewharton.retrofit2.adapter.HttpException
的实例,而实际上是retrofit2.adapter.rxjava2.HttpException
的实例。希望这可以帮助