Android Retrofit的源碼解讀

先提出幾個問題,然后本片文章就根據(jù)下面幾個問題做源碼的解讀。

1.整個請求的流程是怎樣的?
2.底層是如何用 OkHttp 請求的?
3.Okhttp是異步的,retrofit是怎么幫我們切換到主線程的
4.注解是什么時候解析的,怎么解析的?
5.Converter和CallAdapter的作用
6.如何支持 Kotlin協(xié)程的suspend掛起函數(shù)的?

Retrofit的簡單流程圖

image.png

接下來就根據(jù)流程圖進入,首先是Retrofit.build()

image.png

重點1

因為我們一般都不會傳入callbackExecutor(回調(diào)執(zhí)行器),所以他會進入到platform.defaultCallbackExecutor()語句
但是我們直接點進去看的話,會發(fā)現(xiàn),啥也沒有

image.png

那就先從platform入手吧,進入之后能看到
(其實英語也知道platform就是平臺的意思,這里就是做一個平臺的區(qū)分)


image.png

接著再進入Android()


image.png

所以這里可以認(rèn)為callbackExecutor == MainThreadExecutor,用來切換線程

重點2

可以看到上一步拿到的callbackExecutor 作為參數(shù)傳入了platform.defaultCallAdapterFactories(callbackExecutor),進入看到

image.png

接著進入DefaultCallAdapterFactory

image.png

在進入ExecutorCallbackCall

image.png

這就是發(fā)起網(wǎng)絡(luò)請求后,Retrofit幫我們切換到主線程的流程,總得來說就是在build方法中,通過Platform的子類Android()添加了一個默認(rèn)的Executor:MainThreadExecutor,然后還添加了一個DefaultCallAdapterFactory并創(chuàng)建了匿名內(nèi)部類CallAdapterMainThreadExecutor,包裝成ExecutorCallbackCall,在網(wǎng)絡(luò)請求回調(diào),通過它切換線程,并把結(jié)果拋出去

重點3

image.png

如果你沒添加ConverterFacTory的話,默認(rèn)會通過這個轉(zhuǎn)換數(shù)據(jù),你也可以通過繼承Converter.FacTory自定義自己的數(shù)據(jù)轉(zhuǎn)換。Gson的就是這樣做的。

接著Retrofit.create()

這個方法看起來很簡單就是通過動態(tài)代理獲取interface的實例,接著你就可以調(diào)用方法了
當(dāng)我們通過實例調(diào)用方法時,就會進入InvocationHandler.invoke,重點在這里面

image.png

先進入到看一看ServiceMethod

進入loadServiceMethod ,
方法很簡單,就是先從自己保存的中查找,沒有則生成再保存下來,以后可以復(fù)用。

image.png

image.png

先看一下RequestFactory,里面都是方法注解的處理。需要注意的是對kotlin協(xié)程的適配

在RequestFactory的build方法中,會遍歷所有參數(shù),去解析他們

image.png

在跟進到parseParameter,我們知道kotlin在編譯時候,會給方法最后后面添加一個Continuation<T>的參數(shù),

image.png

而這個標(biāo)志位會保存在requestFactory然后傳入HttpServiceMethod
!!這里寫錯了,這里responseType應(yīng)該是Continuation里面的泛型<T>!!

image.png

image.png

1.先看第一個,普通方法進入的CallAdapted
寫錯了,應(yīng)該是loadServiceMethod(method).invoke()調(diào)用的

image.png

image.png

2.當(dāng)是一個suspend方法時

image.png
image.png

interface.enqueue

在調(diào)用apiService.getHttp() 接口的方法
其實就是在調(diào)用 --> InvocationHan.invoke()
最終就是 --> return loadServiceMethod(method).invoke()
在跟進代碼之后,


image.png

所以又回到了DafalutCallAdapterFactory


image.png

看到OkHttpCall的方法


image.png

這是真正的創(chuàng)建OkHttp的Call


image.png

拿到Okhttp的call后就可以網(wǎng)絡(luò)請求了


image.png

這樣通過三步的分析,就能把整個Retrofit流程給串聯(lián)起來了

最后編輯于
?著作權(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)容