攔截方法中最核心的三行代碼:

1.通過loadServiceMeyhod去創(chuàng)建ServiceMethod對象。這個ServiceMethod對象其中包括了網(wǎng)絡(luò)請求接口的方法以及前面配置好注解的一些屬性等等。
2.根據(jù)創(chuàng)建好的ServiceMethod對象,創(chuàng)建一個實際的網(wǎng)絡(luò)請求的對象OkHttpCall,用它來同步異步請求的調(diào)用。
3.會根據(jù)ServiceMethod中的成員變量callAdapter(網(wǎng)絡(luò)請求的適配器),將網(wǎng)絡(luò)請求進(jìn)行不同平臺的適配,也就是調(diào)用adapter這個方法。
首先看一下loadServiceMeyhod:

loadServiceMeyhod這個對象就是讀取網(wǎng)絡(luò)請求接口里的方法,并根據(jù)前面配置好的屬性去配置ServiceMeyhod這個對象。
他會設(shè)置一個同步鎖,設(shè)置一個同步鎖就可以保證不同的線程去讀取LinkedHashMap緩存的時候不會造成數(shù)據(jù)的不安全性。然后調(diào)用緩存當(dāng)中的get方法,ServiceMeyhod這個類通過單例進(jìn)行創(chuàng)建,也就是創(chuàng)建ServiceMeyhod這個對象之前,他會判斷LinkedHashMap緩存當(dāng)中是否有之前創(chuàng)建過的網(wǎng)絡(luò)請求實例。如果沒有緩存,他就設(shè)為空,調(diào)用Builder模式來創(chuàng)建一個ServiceMeyhod對象并進(jìn)行緩存,就是調(diào)用他的put方法將他傳入緩存當(dāng)中。所以說,創(chuàng)建實例的緩存機(jī)制它的核心做法就是使用單例模式實現(xiàn)ServiceMeyhod的唯一性,然后這個ServiceMeyhod對象對應(yīng)網(wǎng)絡(luò)請求接口里的方法。
看一下ServiceMeyhod:

callFactory:就是會生成一個call請求的工廠,這個工廠就是生產(chǎn)OkHttp庫里的call對象。
callAdapter:網(wǎng)絡(luò)請求的適配器。我們從服務(wù)端請求出來的數(shù)據(jù)需要適配不同的平臺,包括Android,Java8等等,這時候就通過callAdapter適配器適配到不同的平臺。
baseUrl:網(wǎng)絡(luò)請求的地址。
Converter:就是負(fù)責(zé)把服務(wù)器返回給數(shù)據(jù)轉(zhuǎn)換成泛型為T這個類型。
httpMethod:網(wǎng)絡(luò)請求Http中的方法。
relativeUrl:網(wǎng)絡(luò)請求的相對地址。baseUrl+relativeUrl就是一個完整的URL地址。
headers:網(wǎng)絡(luò)請求的Http請求頭,是一個鍵值對的形式。
contentType:Http網(wǎng)絡(luò)請求中body的類型。
74-76 三個標(biāo)志位。
parameterHandler:方法參數(shù)的處理器。作用就是負(fù)責(zé)解析接口中定義的每一個方法的參數(shù),然后會構(gòu)造Http請求時設(shè)置參數(shù)的一個過程。
ServiceMeyhod就是包含了訪問網(wǎng)絡(luò)所有的基本信息。
看一下ServiceMeyhod的構(gòu)造方法:

傳入了網(wǎng)絡(luò)請求設(shè)置好的參數(shù),那么就完成了ServiceMeyhod對象的創(chuàng)建。