zoukankan      html  css  js  c++  java
  • Retrofit 2.0+RxJava网络请求源代码解读

    Retrofit 以其性能好,速度快,有很方便的Restful Api 以及数据封装、转换,被大家广泛使用,跟踪学习一下其网络请求的流程。

    网络框架结构如下:

     框架中主要用到4个接口:

    1、Call 用来发送网络请求的,其子类你可以内部自定义实现,一般用默认的http请求

    2、CallAdapter 用来将Call转换为其他对象 (例如:Observable)支持RxJava的转换

    3、Convert 用来将返回的数据转为Java对象 支持XML、Gson、Protobuf

    4、Callback 用来回调网络请求的成功或者失败

    其使用不多说

     重点在Retrofit的create方法 跟踪Create方法:

     Create方法使用的了代理模式 也就是说上边创建的ApiService对象其实是个代理对象,真正实现网络请求是在该代理对象调用具体方法的时候才去实现的

    在该对象调用具体请求方法时必然会被代理拦截到 并调用InvocationHandler的invoke方法,在此方法中实现了serviceMethod的创建,以及具体的请求对象(okhttpCall)创建

     如上图,在loadServiceMethod里通过反射将请求方法的注解中的请求参数以及返回的类型获取到得到serViceMethod对象

    继续往下看adapt()方法,这里Adapt方法的实现类是RxJava2CallAdapter类

     如果使用的一部请求则使用CallEnqueueObservable

    如果使用的是同步方法则使用CallExecuteObservable

    截止目前我们获得的对象只是个请求对象,那么什么时候才去发送这个请求呢 我们配合Retrofit使用的是RXJava

     当执行到subscribe()方法的时候:

     这里的subscribeActual的实现类是CallEnqueueObservable或者CallExecuteObservable类 以同步方法为例:

     到这里才是真正发送请求的地方,继续点击去看execute():这里execute的实现类是OKHttpCall类:

     这里才是真正去请求,这里调用的execute方法是RealCall的方法:

     在这里得到返回的值并转化为了Response对象 其中的getResponseWithInterceptorChain 就是处理一连串我们在初始化Retrofit时的okHttp里边的拦截器

     先将我们定义的拦截器添加到拦截器列表最后又添加了几个固定的拦截器,这里的拦截器的处理逻辑是从index为0一直将每个拦截器走一遍,

    最后一个拦截器得到的是真实的返回数据,再一层层返回给前边的拦截器,其中的CallServerInterceptor是真正的网络请求拦截器,也是最后一个走的拦截器

     CallServerInterceptor拦截器:里边发送请求数据

     接收请求的数据:

     

     就这样一层层的将response返给上层的拦截器  最终返给了OKHttpCall里边的parseResponse方法

    在此方法中就将返回的数据通过serviceMethod封装为咱们一开始在请求接口类里定义的类型

     对应的类型是:LoginData

    @POST(HttpConstant.LOGIN)
    Observable<LoginData> login(@Body RequestBody body);

    具体的转换过程:

     这里的responseConverter是这么创建的:

    这里的responseType在本类这样创建的

     

     继续看callAdapter的创建方法:

     这里的adapterFactories其实就是咱们创建retrofit对象的addCallAdapterFactory  

    到这里我们知道了responseType其实就是LoginData,那么接着看responseConverter的创建

     这里的converterFactories 其实来源就在这里:

     这下全都明白了:

    总结就是 Retrofit配合了RxJava使用先将call对象转为RxJava的Observable对象,通过subscribe去执行这个请求 ,

    返回的数据就通过一层层拦截器过滤之后再经过OKHttpCall 的parseResponse方法将返回的数据通过咱们配置的ConverterFactory转化为一开始定义的返回类型(LoginData);

    多看源代码  理解更深刻,祝大家更上一层楼!




  • 相关阅读:
    Ubuntu下Sublime Text 2优化配置
    Ubuntu14.04 设置wifi热点
    我是如何从程序小白成为码农的
    eclipse 配置黑色主题
    经典面试题(1):统计整数中1的个数
    Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.
    折腾到死:matlab7.0 安装
    VMware 与Ubuntu通过samba服务器共享文件
    大自然的搬运工:Ubuntu环境下gedit的一些个简单配置
    UML(Unified Model Language)统一建模语言
  • 原文地址:https://www.cnblogs.com/bimingcong/p/14209355.html
Copyright © 2011-2022 走看看