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è)攔截器