天天看點

OKHTTP(面試二)

1、OkHttp 建立連接配接的過程,主要涉及到的幾個類包括 StreamAllocation、RealConnection 以及 HttpCodec。

2、首先在RetryAndFollowupIntercept 中建立 StreamAllocation 對象,

到 Connection 中建立 RealConnection 和 HttpCodec,

3、OkHttp 中的連接配接由RealConnection 封裝,RealConnection 封裝了底層的 Socket,Socket 建立了 TCP 連接配接,這是需要消耗時間和資源的,而 OkHttp 則使用連接配接池來管理這裡連接配接,進行連接配接的重用,提高請求的效率,OkHttp 中的連接配接池由 ConnectionPool 實作。

4、Http 流的輸入輸出由 HttpCodec 操作,而 StreamAllocation 則統籌管理這些資源。

5、OkHttp 中的連接配接池主要就是儲存一個正在使用的連接配接的隊列,對于滿足條件的同一個 host 的多個連接配接複用同一個 RealConnection,提高請求效率。此外,還會啟動線程對閑置逾時或者超出閑置數量的 RealConnection 進行清理。

6.OkHttp内部的元件可以通過put()方法向ConnectionPool中添加RealConnection:

首先判斷其否啟動了清理線程,如果沒有則将 cleanupRunnable 放到線程池中。最後是将 RealConnection 放到隊列中;

7、連接配接池get方法:

從隊列中取出一個 Connection 之後,判斷其是否能滿足重用的要求:

如果這個 Connection 已經配置設定的數量超過了配置設定限制或者被标記為不能再配置設定,則直接傳回 false,否則判斷 Address 中除了 host 以外的變量是否相同,如果有不同的,那麼這個連接配接也不能重用。

最後就是判斷 host 是否相同,如果相同那麼對于目前的 Address 來說, 這個 Connection 便是可重用的。

8、清理線程

1、首先統計空閑連接配接數量;

2、而後通過for循環查找最長空閑時間的連接配接以及對應空閑時長;

3、而後判斷這個最長空閑時間的連接配接能否超出最大空閑連接配接數或者者或者者超過最大空閑時間,滿足其一則清理最長空閑的連接配接。假如不滿足清除條件,則傳回一個對應等待時間。

這個對應等待的時間又分二種情況:

1 有空閑連接配接:則傳回:keepAliveDurationNs-longestIdleDurationNs;

2 沒有空閑的連接配接,則傳回:keepAliveDurationNs

注意:清理一個空閑連接配接後,會傳回0,再次立即開始清除。

注意:ConnectInterceptor:負責與伺服器建立連接配接

使用StreamAllocation.newStream來和服務端建立連接配接,并傳回輸入輸出流(HttpCodec),實際上是通過StreamAllocation中的findConnection尋覓一個可用的Connection,而後調用Connection的connect方法,使用socket與服務端建立連接配接。

繼續閱讀