retrofit源碼相關(guān)

一缴阎,retrofit相關(guān)

? ? 1酒觅,ConverterFactory(對(duì)返回的數(shù)據(jù)類(lèi)型進(jìn)行轉(zhuǎn)換)躯枢,目前常用GsonConverterFactory來(lái)將返回的json字符串轉(zhuǎn)換為實(shí)體類(lèi)话肖,也可自定義轉(zhuǎn)換為其他類(lèi)型。

具體內(nèi)容轉(zhuǎn)換是在OkHttpCall中的parseResponse()方法實(shí)現(xiàn)的蜡峰,該方法內(nèi)部調(diào)用了serviceMethod.toResponse(catchingBody)了袁,最終通過(guò)Converter轉(zhuǎn)化為所需類(lèi)型。

? ? 2湿颅,CallAdapterFactory(轉(zhuǎn)換Call對(duì)象)該轉(zhuǎn)換器其實(shí)比較難以理解载绿,主要目的是把真實(shí)的OkHttpCall對(duì)象轉(zhuǎn)換為接口定義里的Call對(duì)象,可以認(rèn)為其實(shí)做的是一個(gè)包裝對(duì)象的轉(zhuǎn)換油航,因?yàn)镃all

對(duì)象本身就可以認(rèn)為是一個(gè)包裝對(duì)象崭庸。可以參考兩個(gè)類(lèi)谊囚。

? ? (1)CallAdapter 冀自,該類(lèi)是將傳入的OkHttpCall轉(zhuǎn)換為了Cal類(lèi)對(duì)象,這是官方的默認(rèn)實(shí)現(xiàn)秒啦,可能較難理解,但是可以看另一個(gè)類(lèi)

? ? (2)RxJava2CallAdapter搀玖,在該類(lèi)中余境,是先把OkHttpCall對(duì)象轉(zhuǎn)換成了Observable對(duì)象,然后根據(jù)具體的返回類(lèi)型返回相應(yīng)的Rx相關(guān)消息發(fā)送對(duì)象灌诅。

? ? 以上這些是對(duì)于返回結(jié)果的處理芳来,但是,本人有一個(gè)疑問(wèn)猜拾,那就是觸發(fā)請(qǐng)求的流程是什么即舌,在哪里。

? ? 我們知道retrofit只負(fù)責(zé)組裝挎袜,所以顽聂,具體的請(qǐng)求是交給了retrofit內(nèi)部的OkHttpCall肥惭,該類(lèi)持有okhttp的call引用,所有請(qǐng)求是通過(guò)它來(lái)執(zhí)行的紊搪,所以蜜葱,我們可以看看OkHttpCall的請(qǐng)求方法

是在哪里調(diào)用的,我們通過(guò)代碼檢索耀石,發(fā)現(xiàn)OkHttpCall里面的enqueue在CallEnqueueObservable這個(gè)類(lèi)中進(jìn)行了調(diào)用牵囤,這個(gè)類(lèi)是繼承Observable的一個(gè)類(lèi),而enqueue方法其實(shí)是在subscribeActual滞伟,

也就是該類(lèi)subscribe的時(shí)候被調(diào)用揭鳞,而再檢索CallEnqueueObservable這個(gè)類(lèi)時(shí),發(fā)現(xiàn)最終邏輯梆奈,在RxJava2CallAdapter類(lèi)中野崇,adapter方法里面定義的responseObservable是一個(gè)新的CallEnqueueObservable對(duì)象

(異步請(qǐng)求),所以鉴裹,流程就相當(dāng)清晰了舞骆,這就是為什么我們的rx結(jié)合retrofit的請(qǐng)求必須在subscribe之后才會(huì)有效了,因?yàn)樵碈allEnqueueObservable就是在subscribe的時(shí)候調(diào)用OkHttpCall的請(qǐng)求方法径荔,

至此督禽,從請(qǐng)求到回調(diào)的整個(gè)邏輯就連接起來(lái)了,至于為什么adapt方法是關(guān)鍵总处,原因就在于retrofit#create方法里面的最后一行serviceMethod.adapt(okHttpCall)狈惫,傳入一個(gè)組裝好的OkHttpCall,重復(fù)

上述流程鹦马。

二胧谈,Type

1,基本類(lèi)型Class(可以認(rèn)為基本和泛型無(wú)關(guān))

2荸频,參數(shù)化類(lèi)型ParameterizedType(含有泛型(非泛型數(shù)組)皆是此類(lèi)型菱肖,如List<String>,Map<K,V>,Set<T>,Class<?>)

3,數(shù)組類(lèi)型GenericArrayType(帶有泛型的數(shù)組旭从,如List[]稳强,Map[])

4,WildcardType(帶上下限的泛型和悦,該種類(lèi)型首先是ParameterizedType類(lèi)型退疫,當(dāng)調(diào)用ParameterizedType類(lèi)型的getActualTypeArguments()方法后,得到的就是WildcardType類(lèi)型)

5鸽素,泛型變量TypeVariable(比如我們定義一個(gè)泛型類(lèi)TestReflect<T>褒繁,并在類(lèi)中定義方法oneMethod(T para),那么當(dāng)調(diào)用method.getGenericParameterTypes()方法得到的Type數(shù)組馍忽,數(shù)組的元素就是由TypeVariable接口實(shí)現(xiàn)的)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棒坏,一起剝皮案震驚了整個(gè)濱河市燕差,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俊抵,老刑警劉巖谁不,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異徽诲,居然都是意外死亡刹帕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)谎替,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)偷溺,“玉大人,你說(shuō)我怎么就攤上這事钱贯〈焯停” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵秩命,是天一觀的道長(zhǎng)尉共。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弃锐,這世上最難降的妖魔是什么袄友? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮霹菊,結(jié)果婚禮上剧蚣,老公的妹妹穿的比我還像新娘。我一直安慰自己旋廷,他們只是感情好鸠按,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著饶碘,像睡著了一般目尖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扎运,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天卑雁,我揣著相機(jī)與錄音,去河邊找鬼绪囱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛莹捡,可吹牛的內(nèi)容都是我干的鬼吵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼篮赢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼齿椅!你這毒婦竟也來(lái)了琉挖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涣脚,失蹤者是張志新(化名)和其女友劉穎示辈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體遣蚀,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矾麻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芭梯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片险耀。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖玖喘,靈堂內(nèi)的尸體忽然破棺而出甩牺,到底是詐尸還是另有隱情,我是刑警寧澤累奈,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布贬派,位于F島的核電站,受9級(jí)特大地震影響澎媒,放射性物質(zhì)發(fā)生泄漏搞乏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一旱幼、第九天 我趴在偏房一處隱蔽的房頂上張望查描。 院中可真熱鬧,春花似錦柏卤、人聲如沸冬三。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勾笆。三九已至,卻和暖如春桥滨,著一層夾襖步出監(jiān)牢的瞬間窝爪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工齐媒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒲每,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓喻括,卻偏偏與公主長(zhǎng)得像邀杏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唬血,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Retrofit 2 源碼解析 關(guān)于Retrofit 2的使用請(qǐng)看上一篇https://www.jianshu.c...
    gogoingmonkey閱讀 517評(píng)論 0 1
  • Retrofit在代碼中的構(gòu)建方式 根據(jù)構(gòu)建方式望蜡,我們先來(lái)看一下Retrofit類(lèi)源碼 (1)Retrofit中的...
    dlihasa閱讀 330評(píng)論 0 4
  • 適配器模式上一篇文章我們已經(jīng)分析了Retrofit解析注解封裝進(jìn)ServiceMethod的流程唤崭,讀者在這里要記住...
    andcoder閱讀 657評(píng)論 0 2
  • Retrofit是一個(gè)Android網(wǎng)絡(luò)框架。是一個(gè)對(duì)OKHttp框架的簡(jiǎn)單封裝脖律。所以其內(nèi)部實(shí)現(xiàn)原理實(shí)際上也是...
    龍城_閱讀 13,011評(píng)論 0 16
  • 本文基于Retrofit2.5.0進(jìn)行源碼分析谢肾,以發(fā)送一個(gè)異步get網(wǎng)絡(luò)請(qǐng)求為例,直到取回?cái)?shù)據(jù)再渲染到頁(yè)面的整個(gè)過(guò)...
    leeeyou閱讀 393評(píng)論 0 0