美文网首页
Retrofit2.0 源码思路整理

Retrofit2.0 源码思路整理

作者: gogoingmonkey | 来源:发表于2018-08-29 16:00 被阅读148次

    看了下之前4月份写的Retrofit使用和 源码分析,发现,源码这种东西,忘记比较快,只能知道大概是怎么的,但是从头去看,花点时间,可以回顾,但是发现思路比较乱,或许是前一次看了太久了,于是整理下,梳理下


    Retrofit 2.0 .png

    思路整理:

    1.创建retrofit

    Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("http://fanyi.youdao.com/") 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build();
    
    1.1第一步 Retrofit :

    使用建造者模式建立Retrofit对象 ,首先有个linkedhashMap数据结构 (后面有原因)存放的 key method value 是ServerMethod ,这个ServerMethod 是网络请求的相关配置,包括了 baseURL 网络请求转换器 网络请求适配器 网络请求工厂 回调执行器 ,还有就是上面的5个相关的 网络请求工厂 适配器工厂集合 List 转换器工厂集合List 加上一个标志 作用是判断是不是要提前检查接口注解进行转换, 第一步 就是配置好这5个 和 linkedhashmap 特别说下 网络请求执行器(Call)——callAdapter 网络请求执行器的适配器——适配器是哪里来的?是callAdapterFactory生产的,在retrofit 中这个适配器有4种,默认的excutorCallAdapterFactory.java8 Guava ,Rxjava,,,,, 在retrofit 中 执行器默认是okhttpcall 比如要将这个默认请求执行器转换成不同平台的 比如rxjava 调用时候就要添加 add CallFactroy(RxjavacallAdapterFactory.create());
    后面的几个步骤都是为了配置好上面的东西,

    1.2.第二步build()

    这个类的成员变量和Retrofit的是对应的,而配置就是通过这个类来配置的, 无参调用了自己的有参构造,传入的参数是PlatForm.get()——get() 返回的是一个静态变量,静态变量是调用——findPlatForm方法,这个方法中通过calss.forName("adnrod.os.build"),也就是调用里面静态构造 判断这个build .version,sdk.int !=0 就new Android()是安卓平台创建一个android对象—— android() 继承platform主要是返回数据做线程切换回主线程显示UI的 重写了defaultcallBack方法,这个newHandler 并绑定主线程,然后post 切换线程 线程切换的流程是 先从第一个重写的defalutCallAdapter
    Factroy 生成一个call对象,然后用这个对象,enquene(callback )从而调用第二个重写方法的excute通过handler完成 ——最后返回一个platForm对象 有参构造:首先是接受上面的platform对象,然后往成员list,存放数据转换器factory的,添加一个new BuiltInConvers对象 这个是一个内置的数据转换器,怼他初始化,
    整个是设置了默认值。没有正真为retrofit成员变量赋值

    1.3.第3步baseUrl

    首先检查是否为空——然后调用parse ()这个parse 是第二步 build 的方法检查一些符号去吧string类型转换成httpurl ,包括方案scheme,成功呢继续,—— 再调用 baseUrl(httpurl url) 判断是否已斜杠结束 不是报错。
    这里主要是为build 类的 url成员变量赋值

    1.4.第4步
    add ConverterFactory( GsonConverterFactory.create())
    

    GsonConverterFactory.create() 创建了一个含有Gson对象实例的GsonConverterFactory,并返回给addConverterFactory()并
    addConvertFactory方法,就是网build类的 转换器工厂list 添加 上面的含有gson对象的工厂类,
    Retrofit默认使用Gson进行解析 如果是其他数据格式 可以自定义继承convert factory 就可以

    1.5..第5步 build

    配置网络请求执行器,配置回调方法执行器,网络请求适配器工厂,数据转换器工厂 然后new Retrofit 返回
    建造者模式,所以开发者并不需要关心配置细节就可以创建好Retrofit实例,

    2、创建网络请求接口实例

        1,定义    接受网络请求实体类
        2.定义接口类
        3.接口     j   =  retofit.create(接口.class)
        4.Call<1的对象>  call    =   j .接口中的getCall()
    

    概述:Retrofit使用外观模式和动态代理,调用create()创建网络请求接口的实例,同时通过接口的注解,进行网络请求参数的配置
    create(): 首先判断是不是接口,并且只能是实现一个接口 ,然后判断之前说的那个标志位,是否需要提前校验,如果需要,就调用earlyvalitedMethod() 在这方法中 用到了反射,获取到所有的方法,然后获取到平台,然后判断如果不是系统方法。调用——loadServiceMethod() : 这个方法通过传入的参数method 去 Retrofit类中的成员中的那个 LinkedHashMap 中获取,如果为空就直接new ServiceMethod.builder(this,method ).build()并存到map 中, 如果不需要提前验证就通过后面的动态代理解析对应方法
    这个create()返回的就是创建网络请求接口的一个动态代理的方法,调用并返回请求接口的实例, 目的就是为了去拿到网络请求接口上的所有注解, 在invoke() 中业调用了loadServiceMethod() —— 吧这个返回的和参数封装到new OkhttpCall中—— 再调用ServiceMethod.callAdapter.adpt(上面封装的call) 好处是调用集中到这个invoke 方法中,并且获取到接口上的注解,方便封装serviceMethed new ServiceMethod.builder(this,method ).build() 也分3个步骤,一是配置,2是获取方法的注解 方法的参数 build 也是从根据接口方法返回值注解,获取对应的网络请求适配器,适配器参数 创建对应的转换器 然后在遍历解析方法注解,也就是调用ParseMethodAnnotation() 这里面就是解析 get post delate等请求 然后是获取参数 数量。遍历 给没个参数 有个paramshandler 去解析参数的注解,这个就是 new ServiceMethod.builder(this,method ).build() 配置完网络请求参数(即配置好ServiceMethod对象) 然后封装到okhttpcall 然后再调用上面配置完网络请求参数的serviceMethod方法的callAdapter ,的adapt() 安卓默认是call Rxjava 是Observable《》

    4.Call<1的对象> call = j .接口中的getCall()
    j实际是动态代理的对象并不是正真网络请求接口创建的对象, 调用这个方法时候被动态代理对象拦截,被proxy.newinstance 拦截调用自己的indicatorHnadler 的invoke方法, 传入 代理对象proxy method args 接下来反射获取注解信息结合agrs 创建serviceMethod对象 最终创建并返回一个OkHttpCall类型的Call对象 okhttp call 是 okhttp 的封装类,但是此时还不能发送请求,还要创建请求对象。

    3.执行网络请求

    同步请求:OkHttpCall.execute()
    异步请求:OkHttpCall.enqueue()
    也就是execute包含下面的3个流程
    1.根据前面的paramshandler 解析参数,结合serviceMethod 对象创建一个Request对象
    createRawCall()创建okhttp3,的request对象
    2.使用ok的request发送请求。
    call.execute()
    3.对返回的数据使用之前设置的GsonConvertFactory解析得到一个Response《T》对象
    response( call.execute()) 判断返回状态码 调用response。success (body )生成 response类
    为了提高效率,Retrofit还会对解析过的请求ServiceMethod进行缓存
    4.异步的 就有一个进行线程切换从而在主线程处理返回的数据结果 若使用RXjava直接回调到主线程
    区别:线程切换流程:1.ExcuterCallAdapterFactry 生成一个ExcutercallbackCall
    2.调用1.的enquene (callback) 从而调用MaindthreadExcuter 的execute()通过handler 切换

    相关文章

      网友评论

          本文标题:Retrofit2.0 源码思路整理

          本文链接:https://www.haomeiwen.com/subject/gmhkwftx.html