Call的作用是执行Request, 既可以同步,也可以是有回调的异步。而CallAdapter的作用,是把Call转换成别的“可异步执行Call中Request的对象”。让开发者有多样性执行异步的方式。
默认的异步执行是Call.enqueue(),而经过CallAdapter转变后,可以用RXJava, 也可以用CompletableFuture,这两个是目前帮你实现好的异步方式。你可以根据实际业务使用它们。
先看一下CallAdapter源码。
public interface CallAdapter<R, T> {
Type responseType();
T adapt(Call<R> call);
}
responseType()返回的是http response 的实体类Type。就是下面方法的“ResponseInfo<Device>”, 也是Call<R>里面的R。
@POST("info/v1/exchange")
Observable<ResponseInfo<Device>> pairDeviceObservable(@HeaderMap Map<String, String> heads, @Body Device device);
T adapt(Call<R> call); 这个方法就是把Call<R>转换成T, 如果是用RxJava的话,那么T就是各种类型的Observable。在Observable里面已经事先把Call<R>封装进去了。
目前有三种CallAdpater, 分别是:
- CompletableFutureCallAdapterFactory
- DefaultCallAdapterFactory
- RxJava2CallAdapterFactory
前面两种是Retrofit默认就添加进去的。而RxJava是需要手动添加的,因为并不是所有的项目都需要RxJava框架,引入了会影响安装包大小。
下面讲一下RxJava2CallAdapter。
RxJava对CallAdapter的实现是RxJava2CallAdapter类。
RxJava2CallAdapter的作用就是返回RxJava上流可观察的Observable, 这样开发者就可以决定上下流的执行线程类型,以及对http response返回的内容做再处理。
final class RxJava2CallAdapter<R> implements CallAdapter<R, Object> {
private final Type responseType;
private final @Nullable Scheduler scheduler;
private final boolean isAsync;
private final boolean isResult;
private final boolean isBody;
private final boolean isFlowable;
private final boolean isSingle;
private final boolean isMaybe;
private final boolean isCompletable;
@Override
public Type responseType() {
return responseType;
}
@Override
public Object adapt(Call<R> call) {
Observable<Response<R>> responseObservable =
isAsync ? new CallEnqueueObservable<>(call) : new CallExecuteObservable<>(call);
Observable<?> observable;
if (isResult) {
observable = new ResultObservable<>(responseObservable);
} else if (isBody) {
observable = new BodyObservable<>(responseObservable);
} else {
observable = responseObservable;
}
if (scheduler != null) {
observable = observable.subscribeOn(scheduler);
}
if (isFlowable) {
return observable.toFlowable(BackpressureStrategy.LATEST);
}
if (isSingle) {
return observable.singleOrError();
}
if (isMaybe) {
return observable.singleElement();
}
if (isCompletable) {
return observable.ignoreElements();
}
return RxJavaPlugins.onAssembly(observable);
}
}
private final boolean isFlowable;
private final boolean isSingle;
private final boolean isMaybe;
private final boolean isCompletable;
决定了Observable的类型。你在定义htttp service 接口的时候,
你可以定义返回Observable<ResponseInfo<Device>>,
也可以定义返回Flowable<ResponseInfo<Device>>,
也可以定义返回Single<ResponseInfo<Device>>,
也可以定义返回Maybe<ResponseInfo<Device>>。
以上是宏观层面的分析。