Android Retrofit框架源碼分析(調(diào)用篇)

Android技術(shù)研究原創(chuàng)如需轉(zhuǎn)載請(qǐng)注明出處

1、配置篇

2、創(chuàng)建篇

前兩篇分析了Retrofit的配置和創(chuàng)建,這篇分析Retrofit的調(diào)用,先模擬一個(gè)調(diào)用的場(chǎng)景,代碼如下:

默認(rèn)看這篇文章的用戶(hù)已經(jīng)讀過(guò)配置篇及創(chuàng)建篇,這個(gè)時(shí)候已經(jīng)獲取了HttpService的代理對(duì)象了

public interface HttpService {
@FormUrlEncoded
@POST("/App/Login.ashx")
public Observable<User> login(@FieldMap Map<String, String> params);
}
以上是一個(gè)接口,里面包含了一個(gè)login方法,現(xiàn)在開(kāi)始模擬一個(gè)login的調(diào)用,代碼如下:

httpService.login(params)

現(xiàn)在場(chǎng)景已經(jīng)模擬出來(lái)了,那么回顧創(chuàng)建篇中的Retrofit.create(HttpService.class)所做的事情,代碼如下:

HttpService_proxy_create.png

return之前的方法在創(chuàng)建篇已經(jīng)做過(guò)分析,現(xiàn)在來(lái)分析return的相關(guān)代碼,這里可以看到在create的時(shí)候返回了一個(gè)動(dòng)態(tài)代理。

1、Java 動(dòng)態(tài)代理作用是什么?
2、代理模式及Java實(shí)現(xiàn)動(dòng)態(tài)代理

那么現(xiàn)在明確了,當(dāng)login方法被調(diào)用的時(shí)候,代理對(duì)象會(huì)調(diào)用它的invoke方法,我們主要分析loadMethodHandler方法,以下是相關(guān)代碼:

invoke中的前兩個(gè)if在當(dāng)前流程不會(huì)進(jìn)入,略過(guò)。

loadMethodHandler.png

以上這段代碼在昨天的創(chuàng)建篇中已經(jīng)分析過(guò)了,現(xiàn)在就不做具體分析了,在這個(gè)方法掉用的過(guò)程中獲取了CallAdapter、Converter、RequestFactory對(duì)象,接著分析invoke方法,代碼如下:

invoke.png

看以上代碼中callAdapter.adapt方法調(diào)用,在創(chuàng)建篇中我們已經(jīng)知道普通的調(diào)用流程獲取的CallAdapter的實(shí)際類(lèi)型是SimpleCallAdapter,現(xiàn)在就可以解釋創(chuàng)建篇中SimpleCallAdapter的adapt實(shí)現(xiàn)的邏輯了,以下是相關(guān)代碼:

adapt.png

以下代碼回調(diào)了OkHttpCall對(duì)象的execute方法,訪(fǎng)問(wèn)網(wǎng)絡(luò)獲取數(shù)據(jù)

CallOnSubscribe.png
execute.png

我們?cè)趧?chuàng)建篇已經(jīng)獲取了OkHttpCall請(qǐng)求時(shí)用到的所有數(shù)據(jù),因此這里可以直接拿來(lái)用,細(xì)節(jié)上就不做太多解釋了。

Retrofit的配置、創(chuàng)建、調(diào)用的基本流程大概就是這樣,后面有空再分析下其他細(xì)節(jié)上的東西。

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

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

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