OkHttp 精講:攔截器執(zhí)行原理

  • 本文章所使用的 OkHttp 源碼版本:3.12.10

源碼解析

  • 老套路拿霉,還是從 OkHttp 用法開始入手這塊的源碼
  • 這個(gè)方法看起來有點(diǎn)可疑吟秩,讓我們接著看是不是這個(gè)方法
  • 看到這里我們基本可以斷定這里就是 OkHttp 攔截器整個(gè)流程的源碼了沪铭,接下來讓我們看看這里面添加了哪些攔截器
  • 到了這里驮肉,我們大致對(duì)這幾個(gè)攔截器有了基本的認(rèn)識(shí),那么問題來了票编,為什么要有這么多攔截器?寫這些攔截器的主要作用是什么登淘?這些攔截器的執(zhí)行流程到底是什么樣的昔榴?

  • 首先 OkHttp 整個(gè)流程是由五個(gè)關(guān)鍵的攔截器完成的吱肌,這五個(gè)攔截器的職責(zé)明確氮墨,從一些攔截器的名稱大概就可以猜出來,例如 CacheInterceptor规揪,從這個(gè)名字我們基本可以猜出來它是負(fù)責(zé)處理請(qǐng)求緩存的奕坟,一套完整的網(wǎng)絡(luò)請(qǐng)求流程很復(fù)雜,需要執(zhí)行幾萬甚至幾十萬行代碼苛萎,如果都寫在一個(gè)類里面可想而知是一件多么恐怖的事情,而攔截器的作用是將這些代碼根據(jù)職責(zé)進(jìn)行分類凹蜂。

  • 至于攔截器的執(zhí)行流程玛痊,我們可以看一下這段代碼

  • 我們可以看到,在添加完一些關(guān)鍵的攔截器之后,最終傳入到了一個(gè)攔截鏈中俗或,最后調(diào)用了執(zhí)行的方法岁忘。接下來讓我們看看這個(gè)方法里面做了什么操作
  • 接下來讓我們重點(diǎn)分析一下這三句源碼的作用
  • 這里有一個(gè)有趣的現(xiàn)象辛慰,一個(gè)類在方法體中 new 了自己,這個(gè)稍微有點(diǎn)難理解干像,但其實(shí)跟遞歸差不多
  • 我們可以看到帅腌,攔截鏈會(huì)根據(jù)索引獲取指定位置的攔截器,并且每 new 一個(gè)攔截鏈對(duì)象索引值都會(huì) + 1
  • 最后將攔截鏈對(duì)象傳遞給攔截器麻汰。

  • 等下速客,你剛剛不是說 proceed 方法會(huì)遞歸?遞歸在哪里呢五鲫?

  • RealInterceptorChain.proceed() -> Interceptor.intercept() -> RealInterceptorChain.proceed() -> Interceptor.intercept() -> 以此類推

  • 等下溺职,你不是說有五個(gè)攔截器,怎么我只看到了兩個(gè)攔截器在調(diào)用位喂?

  • 嗯浪耘,然后呢?還有一個(gè)呢塑崖?去哪里了七冲?

  • 先不要著急,讓我們檢查一下少了哪個(gè)攔截器沒調(diào)用 proceed 方法

  • 沒錯(cuò)规婆,最后一個(gè)攔截器沒調(diào)用 proceed 方法澜躺,那到底是為什么呢?

  • 因?yàn)檫@就是攔截器在調(diào)攔截器的游戲聋呢,假設(shè)總共有五個(gè)攔截器苗踪,第一個(gè)攔截器調(diào)用了第二個(gè)攔截器,第二個(gè)攔截器調(diào)用了第三個(gè)攔截器削锰,第三個(gè)攔截器調(diào)用了第四個(gè)攔截器通铲,第四個(gè)攔截器調(diào)用了第五個(gè)攔截器,那么問題來了器贩,第五個(gè)攔截器要調(diào)用誰颅夺?

  • 沒錯(cuò)朋截,游戲結(jié)束了,沒有再繼續(xù)往下傳遞了吧黄,因?yàn)樗械臄r截器都已經(jīng)遍歷完了

  • Request 對(duì)象經(jīng)過攔截鏈的層層傳遞部服,直到遍歷完所有的攔截器,也就意味著本次網(wǎng)絡(luò)請(qǐng)求完成了拗慨,最終返回 Response 對(duì)象

  • 至此廓八,攔截器大致的執(zhí)行流程到這里就結(jié)束了,讓我們簡(jiǎn)單總結(jié)一下

源碼總結(jié)

  • OkHttp 整個(gè)請(qǐng)求流程是由一條攔截鏈完成赵抢,攔截鏈會(huì)用遞歸的方式來遍歷整個(gè)攔截器列表剧蹂,直到最后一個(gè)攔截器才停止遞歸,等所有的攔截器遍歷完了網(wǎng)絡(luò)請(qǐng)求也就結(jié)束了烦却,然后由攔截鏈返回最終的請(qǐng)求結(jié)果宠叼。

下一篇:OkHttp 精講:RetryAndFollowUpInterceptor

Android 技術(shù)討論 Q 群:10047167

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市其爵,隨后出現(xiàn)的幾起案子冒冬,更是在濱河造成了極大的恐慌,老刑警劉巖摩渺,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件简烤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摇幻,警方通過查閱死者的電腦和手機(jī)乐埠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囚企,“玉大人丈咐,你說我怎么就攤上這事×辏” “怎么了棵逊?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)银酗。 經(jīng)常有香客問我辆影,道長(zhǎng),這世上最難降的妖魔是什么黍特? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任蛙讥,我火速辦了婚禮,結(jié)果婚禮上灭衷,老公的妹妹穿的比我還像新娘次慢。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布迫像。 她就那樣靜靜地躺著劈愚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闻妓。 梳的紋絲不亂的頭發(fā)上菌羽,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音由缆,去河邊找鬼注祖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛均唉,可吹牛的內(nèi)容都是我干的氓轰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼浸卦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了案糙?” 一聲冷哼從身側(cè)響起限嫌,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎时捌,沒想到半個(gè)月后怒医,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奢讨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年稚叹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拿诸。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扒袖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亩码,到底是詐尸還是另有隱情季率,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布描沟,位于F島的核電站飒泻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吏廉。R本人自食惡果不足惜泞遗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望席覆。 院中可真熱鬧史辙,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至方库,卻和暖如春结序,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纵潦。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工徐鹤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邀层。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓返敬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親寥院。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劲赠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348