攔截器流程:網絡
簡單回顧同步 / 異步:異步
同步請求就是執行請求的操做是阻塞式,直到HTTP響應返回。spa
異步請求就相似於非阻塞式的請求,它的執行結果通常都是經過接口回調的方式告知調用者。 3d
okHttp攔截器:blog
來自官網的解釋:攔截器是OkHttp中提供一種強大的機制,它能夠實現網絡監聽、請求以及響應重寫、請求失敗重試等功能。接口
下面來看一下官網的一張介紹攔截器的圖:同步
其中Okhttp包含Application Interceptors【應用攔截器】、系統攔截器、Network Interceptors【網絡攔截器】,其中我們接下來要分析的就是從系統自帶的攔截器開始,那系統攔截器都有哪些呢,以下圖:源碼
關於這些系統攔截器在接下來會一一進行詳細分析的,目前先有個大體的印象。io
攔截器鏈介紹:循環
有了上面的理論瞭解以後,下面則從源碼的角度來對攔截器進行一個進一步瞭解,這裏以同步請求爲例,由於異步請求關於攔截器這塊基本上同樣:
進一步定位:
那接下來將注意力集中在RealInterceptorChain.proceed()方法中:
而後此時在這個方法中有個核心代碼:
這樣就將若干個攔截器以鏈式的方式進行執行,這也是攔截器鏈的主要做用。下面總結一下攔截器:
一、建立一系列的攔截器,並將其放入到一個攔截器list中。
二、建立一個攔截器鏈RealInterceptorChain,並執行攔截器鏈的proceed方法。
那目前對於攔截器怎麼鏈起來的有了一個大局觀,那到底每一個攔截器是怎麼來銜接的呢?這裏以一個具體的攔載器爲例初步進行分析:RetryAndFollowUpInterceptor:
因此將目光集中在這個方法之上,代碼比較多,這裏先只看核心的:
而如以前所分析,咱們知道RealInterceptorChain在proceed()方法中又會去獲取下一個攔截器繼續往下鏈,以下:
如此循環,就會將全部的攔截器依順序一個個去執行完成,這也就是攔截器的一個核心實現邏輯。因此下面對攔截器的具體邏輯再總結一下:
一、在發起請求前對request進行處理。
二、調用下一個攔截器,獲取response。
三、對response進行處理,返回給上一個攔截器。