Retrofit2.0 源码思路整理

看了下之前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 切换

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容