Android技術(shù)研究原創(chuàng)如需轉(zhuǎn)載請(qǐ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)所做的事情,代碼如下:

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

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

看以上代碼中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)代碼:

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


我們?cè)趧?chuàng)建篇已經(jīng)獲取了OkHttpCall請(qǐng)求時(shí)用到的所有數(shù)據(jù),因此這里可以直接拿來(lái)用,細(xì)節(jié)上就不做太多解釋了。
Retrofit的配置、創(chuàng)建、調(diào)用的基本流程大概就是這樣,后面有空再分析下其他細(xì)節(jié)上的東西。