Android 网络框架之Retrofit源码解析,满满干货指导

public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {

Class<?> rawType = getRawType(returnType);

if (rawType == Completable.class) {

// 创建RxJava2CallAdapter

return new RxJava2CallAdapter(Void.class, scheduler, isAsync, false, true, false, false,

false, true);

}

// 创建RxJava2CallAdapter

return new RxJava2CallAdapter(responseType, scheduler, isAsync, isResult, isBody, isFlowable,

isSingle, isMaybe, false);

}

这个方法职责很明确,就是根据各种参数来创建RxJava的CallAdpter,也就是RxJava2CallAdapter;

这里我们来重点关注一个RxJava2CallAdapte的adapt方法的逻辑;

public Object adapt(Call call) {

// 第一步:根据是否是异步的参数创建对应的Observable

Observable<Response> responseObservable = isAsync

? new CallEnqueueObservable<>(call)
new CallExecuteObservable<>(call);

Observable<?> observable;

// 第二步:根据各种判断,再封装一层Observable返回

if (isResult) {

observable = new ResultObservable<>(responseObservable);

} else if (isBody) {

observable = new BodyObservable<>(responseObservable);

} else {

observable = responseObservable;

}

return observable;

}

这个方法的逻辑并复杂,主要是将Call请求转化为RxJava的请求,最终返回一个RxJava的被观察者:Observable,用于进行RxJava类型的网络请求,如上面的示例;

这个方法的逻辑主要有两步,我们先来看一下第一步创建的被观察者,这里会先判断是否是异步,如果是异步的话,那么就创建CallEnqueueObservable,否则就创建CallExecuteObservable;

这两个的区别就是,在调用订阅(subscribe)的时候,会执行CallEnqueueObservable的subscribeActual方法,最终是通过OkHttpCall的enqueue方法来执行异步请求;

而CallExecuteObservable在调用订阅(subscribe)的时候,也会执行CallEnqueueObservable的subscribeActual方法,在这个方法里,就直接调用OkHttpCall的execute方法来执行同步请求;

而第二步的封装,这里我们主要以BodyObservable来进行讲解,这个类会对订阅的观察者进行封装,在onNext方法中将body返回;这一步可以理解为对返回的结果进行处理;

这里是RxJava的用法,我默认你是会的,如果对RxJava还不熟悉的同学,可以后面去看看RxJava的用法;

到此,Retrofit的CallAdapter.Factory的逻辑就先告一段落了,下面我们来看看Retrofit的最终build()方法的逻辑;

4.5、Retrofit.Builder#build

废话不多说,我们直接撸源码;

public Retrofit build() {

// 判断当callFactory(OkHttpClient)为空,就重新创建一个OkHttpClient进行赋值;

okhttp3.Call.Factory callFactory = this.callFactory;

if (callFactory == null) {

callFactory = new OkHttpClient();

}

// 判断Executor为空时,就用Platform的默认Executor进行赋值,上面我们讲过,这里面使用的是主线的的Handler;

Executor callbackExecutor = this.callbackExecutor;

if (callbackExecutor == null) {

callbackExecutor = platform.defaultCallbackExecutor();

}

// 通过添加的CallAdapter.Factory来创建一个新的CallAdapter.Factory集合;

List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);

// 添加Platform的默认CallAdapter.Factory,如果我们没有添加CallAdapter.Factory,那么就会使用这个Platform的默认CallAdapter.Factory; callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));

// 创建Converter.Factory的集合

List<Converter.Factory> converterFactories = new ArrayList<>(

1 + this.converterFactories.size() + platform.defaultConverterFactoriesSize());

// Add the built-in converter factory first. This prevents overriding its behavior but also

// ensures correct behavior when using converters that consume all types.

// 添加默认的Converter.Factory

converterFactories.add(new BuiltInConverters());

// 添加自定的Converter.Factory

converte

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值