本著針對面試,不負責任的態度,寫下《面試總結》系列。本系列記錄面試過程中各個知識點,而不是入門系列,如果有不懂的自行學習。
轉載請標明出處,本文地址: http://www.lxweimin.com/p/6ed08f540741
更新列表
日期 | 修改內容 |
---|---|
2019年3月22日 | 修改部分顯示格式 責任鏈模式Demo |
2019年3月25日 | 添加面試題&個人解析 |
Okhttp是對Socket的封裝。有三個主要的類,Request,Response,Call
默認使用new OkHttpClient() 創建初client對象。
如果需要初始化網絡請求的參數,如timeout,interceptor等,可以創建Builder,通過builder.build() 創建初client對象。
使用new Request.Builder().url().builder()創建初requst對象。
通過client.newCall()創建出call對象,同步使用call.excute(), 異步使用call,enqueue(). 這里Call是個接口,具體的實現在RealCall這個實現類里面。
Okhttp的高效體現在,okhttp內有個Dispatcher類,是okhttp內部維護的一個線程池,對最大連接數,host最大訪問量做了初始定義。維護3個隊列及1個線程池
readyAsyncCalls
待訪問請求隊列,里面存儲準備執行的請求。
runningAsyncCalls
異步請求隊列,里面存儲正在執行,包含已經取消但是還沒有結束的請求。
runningSyncCalls
同步請求隊列,正在執行的請求,包含已經取消但是還沒有結束的請求。
ExecutorService
線程池,最小0,最大Max的線程池
在執行call.excute()的時候,調用到realcall類里的excute方法,這個是同步方法,在方法的第一行就加了鎖,判斷executed標記,如果是true就拋出異常,保證一個請求只被執行一次。false的話繼續向下執行。調用client.dispatcher.excute()進入到dispatcher類中,向runningSyncCalls隊列中添加當前這個請求。執行結束會調用finished方法
如果是異步操作,會創建一個RealCall.AsyncCall對象,AsyncCall繼承的NamedRunnable接口,NamedRunnable是個runnable。進入到Dispatcher的enqueue()方法中,首先判斷線程池中線程的數據,host的訪問量,如果都沒有達到那么加入到runningAsyncCalls中,并執行。否則加入到readyAsyncCalls隊列中。
finished方法,如果是異步操作,promoteCall方法,promoteCalls()中用迭代器遍歷readyAsyncCalls 然后加入到runningAsyncCalls
RealConnection
真正的連接操作類,對soket封裝,http1/http2的選擇,ssl協議等等信息。一個recalconnection就是一次鏈接
ConnectionPool
鏈接池,管理http1/http2的連接,同一個address共享一個connection,實現鏈接的復用。
StreamAlloction
保存了鏈接信息,address,HttpCodec,realconnection,connectionpool等信息
在realCall中 getResponseWithInterceptorChain()創建并開啟攔截器鏈
Okhttp中的攔截器,默認的分為6種
-
RetryAndFollowUpInterceptor
做網絡失敗重連,但是并不是所有的請求都需要重連,根據響應碼。MAX_FOLLOW_UPS=20最大重連次數
在intercept方法中創建了StreamAllocation對象,并調用chain.proceed方法,執行下一個攔截器,對request進行處理,并返回response。 -
BirdgeInterceptor
初始化信息,添加請求頭等,例如gzip,keep-alive,返回的response進行解壓 -
CacheInterceptor
內部有Cache類,處理緩存操作,intercache內部類,disklrucache算法等
重點是不緩存非get的請求。
CacheStrategy緩存策略類,通過工廠模式獲取 -
ConnectionInterceptor(建議重點閱讀源碼)
建立鏈接,使用之前創建好的StreamAllocation,初始化httpcodec,realConnection。內部使用了類似gc標記清理算法,對無用的connection進行標記,StramAlloction漸漸變成0,線程池檢測并回收,保證多個健康的keep-alive鏈接 -
CallServerInterceptor
發起真正的網絡請求,解析返回的數據
http寫入網絡IO流,從網絡IO流中讀取返回給客戶端的數據。 -
Network Interceptors
Application interceptors & Network Interceptors區別查看相關資料
okhttp wiki
OkHttp中的設計模式
單例、Builder、策略、責任鏈、觀察者
思考:
策略與簡單工廠的區別
相關面試題
- 責任鏈模式DEMO
- IO操作流程
- 三級緩存的流程說一遍
- 請求配置都有哪些方法。
- okhttp斷點續傳用什么保存,怎么實現斷點續傳流程