OkHttp 源碼閱讀

從執行流程閱讀

client.newCall(request).enqueue(new Callback())

newCall(request)爲這個請求生成RealCall。RealCall負責請求的發起,取消,超時等對請求的操作。

enqueue(new Callback()) 此方法整個調用鏈過程中,生成AsyncCall。封裝了Callback,實現了runnable。將AsyncCall交由Dispatcher管理。Dispatcher負責異步任務執行的policy。它根據Max capacity和Host max capacity決定如何執行任務。最終,執行的時候,它將AsyncCall放到線程池中去執行。他使用的線程池和緩存線程池一樣。AysncCall被調用執行的時候,是如何發出網絡請求的呢?這裏就涉及到OkHttp的責任鏈模式的閱讀。

下面,重點介紹下OkHttp的責任鏈模式。

責任鏈主要的一個角色是處理者。它擔負的是處理請求,如果不能處理則轉發給下一個。在OkHttp中,處理者角色就是Interceptor。源碼佔了很大篇幅的Chain更多的是傳遞處理者需要使用到的數據,並且提供proceed方法調用下一個處理者。若當前處理者可以完成請求任務,將停止下一個處理者的調用。

源碼自帶的處理者有:

RetryAndFollowUpInterceptor 請求失敗重連和重定向。在followUpRequest方法中,會有407和30x的處理。
BridgeInterceptor 負責將用戶請求轉換爲網絡請求。很多頭字段都會在這裏處理,比如cookie Content-Length、Connect、Host
CacheInterceptor 負責緩存響應數據。其持有的CacheStrategy會通過強弱緩存來進行緩存的處理。
ConnectInterceptor 打開一個到服務端的連接。
CallServerInterceptor 把 Request 中的數據發送到服務端,並獲取到數據寫入 Response。

CallServerInterceptor 是最後一個處理者,他不會再調用chain提供的proceed而是直接返回。其他的處理者都會通過proceed去調用下一個處理者。

所以,這裏想要強調的責任鏈模式:核心是設計一個處理者角色,將他抽象。同時可以參靠OkHttp的chain的設計,將處理者所需要使用和傳遞的數據放在chain中,並通過chain調用下一個處理者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章