OkHttp RetryAndFollowUpInterceptor 攔截器源碼分析

image
其實(shí)從 RetryAndFollowUpInterceptor 的名字大概就知道它的作用是失敗重連的攔截器丐吓。比如我們在想要做連接失敗重連浅悉,就可以到創(chuàng)建的 OkHttpClient 對象進(jìn)行配置。(這里需要注意券犁,并不是所有的網(wǎng)絡(luò)請求是可以進(jìn)行失敗重連的术健,這是有一定的限制范圍粘衬,所以說OkHttp內(nèi)部會(huì)給網(wǎng)絡(luò)請求檢測網(wǎng)絡(luò)異常勘伺,響應(yīng)碼情況的判斷,如果在它的限制范圍內(nèi),就可以根據(jù)條件進(jìn)行網(wǎng)絡(luò)請求的重連)股毫。

我們看下源碼,主要還是到 intercept() 方法中去查看


image.png

  • realChain(RealInterceptorChain)這個(gè)攔截器對象其實(shí)就是將我們所有的攔截器進(jìn)行串聯(lián)的苍凛。
  • 每個(gè)攔截器調(diào)用intercept()方法時(shí)都會(huì)執(zhí)行realChain.proceed()這個(gè)方法宣肚,而在執(zhí)行 RealInterceptorChain 攔截器鏈的proceed()方法又會(huì)得到下標(biāo)為 index 的攔截器按价,并且執(zhí)行這個(gè)攔截器的 intercept() 方法傳入下標(biāo)為 index+1 的攔截器鏈。這樣就完成了整個(gè)的攔截器鏈的串聯(lián),所以說只有所有的攔截器執(zhí)行完成之后秉宿,才完成了整個(gè)的網(wǎng)絡(luò)請求导而,也才會(huì)返回響應(yīng)對象 Response窑多。

intercept() 方法中我們發(fā)現(xiàn)創(chuàng)建了StreamAllocation對象。

StreamAllocation 是什么?

StreamAllocation其實(shí)就是用來建立執(zhí)行Http請求中所需要那些網(wǎng)絡(luò)組件的拾弃。主要是用于獲取連接服務(wù)端的數(shù)據(jù)傳輸?shù)妮斎胼敵隽鳌?/p>

注意:

StreamAllocation雖然是在RetryAndFollowUpInterceptor這個(gè)攔截器中創(chuàng)建的携栋,但是它在這個(gè)攔截器中并沒有被使用到鸯隅,只是通過攔截器鏈依次的向下傳送,最后到ConnectInterceptor攔截器中真進(jìn)行作用咽筋。

在平時(shí)的開發(fā)中庇忌,網(wǎng)絡(luò)本來就是不穩(wěn)定的略就,會(huì)出現(xiàn)多種情況。那RetryAndFollowUpInterceptor怎么做的處理呢贝次?


image.png

image.png

這里的 while 循環(huán)崔兴,就是網(wǎng)絡(luò)連接失敗一些部署,所有的邏輯全在這個(gè)循環(huán)中蛔翅。

接下來我們看源碼中下一個(gè)地方


image.png

我們知道重試不可能無限制的重試敲茄。所以源碼中設(shè)置了最大重試次數(shù)為20。如果超過20次山析,就釋放 StreamAllocation對象了堰燎。

到這里 RetryAndFollowUpInterceptor 攔截器的作用就大概清楚了

總結(jié)

1.創(chuàng)建 StreamAllocation 對象
2.調(diào)用 RealInterceptorChain.proceed(...) 進(jìn)行網(wǎng)絡(luò)請求
3.根據(jù)異常結(jié)果或者響應(yīng)結(jié)果判斷是否需要進(jìn)行重新請求
4.調(diào)用下一個(gè)攔截器,對 reaponse 進(jìn)行處理笋轨,返回給上一個(gè)攔截器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秆剪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爵政,更是在濱河造成了極大的恐慌鸟款,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茂卦,死亡現(xiàn)場離奇詭異何什,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)等龙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門处渣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伶贰,“玉大人,你說我怎么就攤上這事罐栈∈蜓茫” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵荠诬,是天一觀的道長琅翻。 經(jīng)常有香客問我,道長柑贞,這世上最難降的妖魔是什么方椎? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮钧嘶,結(jié)果婚禮上棠众,老公的妹妹穿的比我還像新娘。我一直安慰自己有决,他們只是感情好闸拿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著书幕,像睡著了一般新荤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上台汇,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天苛骨,我揣著相機(jī)與錄音,去河邊找鬼励七。 笑死智袭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掠抬。 我是一名探鬼主播吼野,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼两波!你這毒婦竟也來了瞳步?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腰奋,失蹤者是張志新(化名)和其女友劉穎单起,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劣坊,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘀倒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测蘑。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灌危,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碳胳,到底是詐尸還是另有隱情勇蝙,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布挨约,位于F島的核電站味混,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诫惭。R本人自食惡果不足惜翁锡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贝攒。 院中可真熱鬧盗誊,春花似錦时甚、人聲如沸隘弊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梨熙。三九已至,卻和暖如春刀诬,著一層夾襖步出監(jiān)牢的瞬間咽扇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工陕壹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留质欲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓糠馆,卻偏偏與公主長得像嘶伟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子又碌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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