retrofit是Square公司對(duì)OKHTTP封裝的網(wǎng)絡(luò)請(qǐng)求框架,完美支持rxjava,主要思想是使用java的動(dòng)態(tài)代理和注解通過(guò)反射獲取okhttp需要的參數(shù),方便開(kāi)發(fā)人員通過(guò)路由表的形式來(lái)管理訪問(wèn)鏈接,本人分三部分分別記錄retrofit的實(shí)例化 ,網(wǎng)絡(luò)請(qǐng)求 ,以及參數(shù)解析,本篇為retrofit的實(shí)例化流程:
retrofit的入口為Retrofit類,Retrofit使用builder模式來(lái)構(gòu)建參數(shù)

platform是平臺(tái),retrofit可以支持android ,java8和ios,platform使用的單例模式實(shí)例化,通過(guò)Platform類 的findPlatform()來(lái)判斷當(dāng)前使用的平臺(tái)

android palatform就是獲取主線程池,并設(shè)置handler的回調(diào),callFactory是OKHTTP,baseurl為鏈接,converterFactories為流轉(zhuǎn)換器,gson轉(zhuǎn)換器GsonConverterFactory就是放在這里面,
adapterFactories為適配器,rxjava的RxJavaCallAdapterFactory放在這個(gè)列表里,callbackExecutor為回調(diào)線程

在builder build的時(shí)候,會(huì)獲取平臺(tái)的回調(diào)線程,android平臺(tái)為主線程
通過(guò)builder初始化參數(shù)后,在build()中創(chuàng)建Retorfit實(shí)例,在需要請(qǐng)求網(wǎng)絡(luò)的時(shí)候,通過(guò)create()調(diào)用,create()的參數(shù)為路由表類接口

retrofit通過(guò)注解獲取訪問(wèn)參數(shù)

retrofit 通過(guò)調(diào)用create()反射method來(lái)調(diào)用okhttp訪問(wèn)網(wǎng)絡(luò),create中,通過(guò)java反射來(lái)獲取servicemethod類的實(shí)例,并吧相關(guān)注解信息傳遞給servicemethod類

mothodAnnotations為method注解,parameterTypes為method返回類型的泛型,parameterAnnotationsArray為method參數(shù)注解
在servicemethod builder build()方法中,對(duì)路由表中的方法信息進(jìn)行解析

在build中,通過(guò)createCallAdapter()獲取okhttp網(wǎng)絡(luò)訪問(wèn)的adapter

在createCallAdapter中,獲取方法返回類型以及method的注解,然后調(diào)用retrofit的calladapter獲取calladapter,在callAdapter中,如果設(shè)置了RxJavaCallAdapterFactory,會(huì)返回RxJavaCallAdapterFactory的實(shí)例,否則會(huì)返回默認(rèn)的ExecutorCallAdapterFactory
(注:retrofit配合rxjava會(huì)更簡(jiǎn)潔,所有以下會(huì)使用RxJavaCallAdapterFactory,而不是ExecutorCallAdapterFactory)
,在calladapterFactory中,開(kāi)始訪問(wèn)網(wǎng)絡(luò),什么時(shí)候調(diào)用網(wǎng)絡(luò)請(qǐng)求的呢?可以看retrofit的create()方法中

通過(guò)動(dòng)態(tài)代理,獲取到RxJavaCallAdapterFactory的實(shí)例,然后調(diào)用adapter? 的adapt方法,開(kāi)始通過(guò)okhttp發(fā)起網(wǎng)絡(luò)訪問(wèn)
這部分就是retrofit 的實(shí)例化流程,那retrofit是如何請(qǐng)求網(wǎng)絡(luò)的呢?下回分解
retrofit源碼解析(二)網(wǎng)絡(luò)請(qǐng)求
原創(chuàng),轉(zhuǎn)載請(qǐng)標(biāo)明