Retrofit中的RxJavaCallAdapterFacto
由于RxJava的火热,基本上对于现在每个项目都是标配。而retrofit+RxJava配合使用也是大部分人的选择。
大致是长成这样的:
Retrofit.Builder builder = new Retrofit.Builder();
builder.client(getOkClient());
builder.baseUrl(apiUrl);//设置远程地址
builder.addConverterFactory(GsonConverterFactory.create(getGson()));
builder.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
builder.build().create(自定义的Retrofit接口);
上面代码就是生成一个“自定义的Retrofit接口”的代理对象;继而调用接口里面的方法;返回一个Observable泛型是接收的对象:
@GET("拼接的url")
Observable<接收的对象> getBean();
以上就是一个标准的Retrofit请求流程吧。今天看看RxJavaCallAdapterFactory里面是如何工作的。
RxJavaCallAdapterFactory的结构
RxJavaCallAdapterFactory类图.png- CallOnSubscribe 创建RequestArbiter,setProducer
- RequestArbiter 最终调用OkHttpCall的excute()
- ResponseCallAdapter 没有涉及
- ResultCallAdapter 没有涉及
- SimpleCallAdapter adapt()方法创建CallOnSubscribe对象
一共5个内部类
之前写的Retrofit使用范例的源码分析 一文中,
可以看到第四第五步在使用RxJavaCallAdapterFactory是省略的。
今天看看RxJavaCallAdapterFactory到底干了些什么,从这个侧面上也再了解一下RxJava。
Retrofit的create()方法
image.png上面代码是Retrofit的create()方法。上篇文章Retrofit使用范例的源码分析 ,已经介绍过了。
基本上
- ServiceMethod 封装自定义接口里面的参数,即(我们自己定义的接口给Retrofit生成代理对象用的)
- OkhttpCall 主要连接OkHttp框架调用网络请求
- serviceMethod.callAdapter.adapt(okHttpCall);就是根据你的callAdapter返回一个代理对象。
RxJavaCallAdapterFactory的adapt()方法
在RxJavaCallAdapterFactory类里面是没有adapt()方法的。那么是哪个内部类的这个方法;
image.png
Retrofit创建的CallAdapter
Retrofit中通过nextCallAdapter()方法获取到CallAdapter
image.png
这样的话就是调用RxJavaCallAdapterFactory的get()方法
image.png
这里是通过调用getCallAdapter()获取到callAdapter,而RxJavaCallAdapterFactory现在是获取到SimpleCallAdapter
image.png
截图中的那些都由于Type的class不对所以一一排除最终获取SimpleCallAdapter。
callAdapter知道了,看看SimpleCallAdapter的adapt()方法。
image.png- Observable<R> observable = Observable.create(new CallOnSubscribe<>(call))
这段代码看似创建一个Observable可观察对象;但不要忽略参数:
new CallOnSubscribe<>(call)
RxJavaCallAdapterFactory的内部类:CallOnSubscribe
主要是实现Observable.OnSubscribe接口:
注释:当可观察对象订阅就会被调用;
其实里面就是Action1的call()方法;
换句话就是看看CallOnSubscribe的call方法实现
CallOnSubscribe的call方法实现
image.png这里就是给订阅者添加一个RequestArbiter和设置Producer。
关键是subscriber.setProducer(requestArbiter);
subscriber.setProducer(requestArbiter);
image.png最终是会调用RequestArbiter的request()
RequestArbiter的request()
image.png最终OkHttpCall就是通过RequestArbiter的request()方法调用的。