Retrofit(四) CallAdapter

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>>。

 

以上是宏观层面的分析。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值