现实开发中用到的框架为了方便更好的理解加深记忆,归纳如下:
做Android开发网络请求可是必经之路 ,想当年刚开始做开发的时候使用过httpClient 手写get和post,也使用过Volley,还是用过XUtils等一些框架,很大程度上方便了开发,retrofit是在17年的时候项目重构的时候引入是用的(原谅我是个喜新厌旧的码奴),使用后感觉好嗨呦!感觉人生已经达到了巅峰 ! 主要是因为其强大的解耦能力和可扩展性!
用了这么久的retrofit不应该留在知其然不知其所以然呀。然后就挑灯夜读,悬梁刺股的研究了一下源码,还好源码不太多,算是对其工作原理有了大致的了解 首先呢retrofit的源码目录就这么多
retrofit目录 先进入retrofit类中看一下retrofit类中的成员变量
看着这些会发现这些不就是在创建retrofit的时候使用build构建对象的时候需要传入的参数,额外注意一下那个map集合中的ServiceMethod
接下来看build方法
build方法在这个方法里会把前面传入的参数给配置,当然也可以看出retrofit底层其实还是通过okhttp进行网络请求的
继续看就是关键的create方法了,所有神奇的变化都是在这个方法里面进行的
create在create中使用了动态代理把传入的接口class对象中的接口实例给返了回来,也就是proxy.newProxyInstance返回了接口的实例,其中它内部需要传递一个类的加载器,类本身以及一个InvocationHandler处理器,主要的动作都是在InvocationHandler中进行的,它里面只有一个方法invoke()方法,每当我们调用代理类里面的方法时invoke()都会被执行,并且我们可以从该方法的参数中获取到所需要的一切信息,比如从method中获取到方法名,从args中获取到方法名中的参数信息等,,,,接着往下看
几行厉害的代码这里会发现每个方法都生成了一个serviceMethod,oadServiceMethod方法先从map缓存中找该方法对应的ServiceMethod对象,如果没有则生成。根据ServiceMethod对象和参数得到了OkHttpCall对象。再由方法对应的callAdapter将OkHttpCall适配成想要的异步回调接口
所以呢retrofit的大致工作原理就是:
使用建造者模式创建retrofit实例,使用动态代理模式和注解动态创建服务类和方法,创建过程中根据每个method类生成ServiceMethod类,这个类中包含了注解信息和参数信息,在这个过程中根据method的信息创建一个对call处理的工厂类对象,并且根据注解获取相关对注解处理的对象,然后这些注解对象会转换生成okhttp请求所需要的Request对象,再接着将ServiceMethod和输入参数赋值给OkhttpCall这个类,这个类在之后将配合callbackExecutor这个线程控制的类,以及ServiceMethod生成的Request对象,内部调用Okhttp进行请求和回调。
网友评论