先提出幾個問題,然后本片文章就根據(jù)下面幾個問題做源碼的解讀。
1.整個請求的流程是怎樣的?
2.底層是如何用 OkHttp 請求的?
3.Okhttp是異步的,retrofit是怎么幫我們切換到主線程的
4.注解是什么時候解析的,怎么解析的?
5.Converter和CallAdapter的作用
6.如何支持 Kotlin協(xié)程的suspend掛起函數(shù)的?
Retrofit的簡單流程圖

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

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

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

接著再進入Android()

所以這里可以認(rèn)為callbackExecutor == MainThreadExecutor,用來切換線程
重點2
可以看到上一步拿到的callbackExecutor 作為參數(shù)傳入了platform.defaultCallAdapterFactories(callbackExecutor),進入看到

接著進入DefaultCallAdapterFactory

在進入ExecutorCallbackCall

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

如果你沒添加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,重點在這里面

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


先看一下RequestFactory,里面都是方法注解的處理。需要注意的是對kotlin協(xié)程的適配
在RequestFactory的build方法中,會遍歷所有參數(shù),去解析他們

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

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


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


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


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

所以又回到了DafalutCallAdapterFactory

看到OkHttpCall的方法

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

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