RxJavaRxJava系列专题(Android方向)

Retrofit中的RxJavaCallAdapterFacto

2017-11-27  本文已影响83人  721d739b6619

由于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

之前写的Retrofit使用范例的源码分析 一文中,

image.png
可以看到第四第五步在使用RxJavaCallAdapterFactory是省略的。
今天看看RxJavaCallAdapterFactory到底干了些什么,从这个侧面上也再了解一下RxJava。

Retrofit的create()方法

image.png

上面代码是Retrofit的create()方法。上篇文章Retrofit使用范例的源码分析 ,已经介绍过了。
基本上

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可观察对象;但不要忽略参数:
new CallOnSubscribe<>(call)

RxJavaCallAdapterFactory的内部类:CallOnSubscribe

image.png

主要是实现Observable.OnSubscribe接口:

image.png
注释:当可观察对象订阅就会被调用;
其实里面就是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()方法调用的。

上一篇下一篇

猜你喜欢

热点阅读