Retrofit源碼解讀:serviceMethod和retrofit核心代碼

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

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)建。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容