OkHttp源碼解讀總結(一)--->OkHttp框架流程

OkHttp源碼解讀總結(一)—>OkHttp框架流程

標籤(空格分隔): OkHttp源碼 學習筆記


前言

  • 以下的相關知識總結是通過慕課網的相關學習和自己的相關看法,如果有需要的可以去查看一下慕課網的相關教學,感覺還可以。

框架流程

OkHttpClient—>Request—>RealCall—>Dispatcher—>interceptors—>RetryAndFollow/Bridge/Cache/Connect/CallServer

OkHttpClient

  • 首先會創建這個OkHttpClient對象,表示我們所有的請求的一個客戶端的類,單例創建,只會創建一個

Request

  • 創建Request這個對象,這個對象封裝了一些請求報文信息,請求URL地址,請求方法(get/post/put/delete…),還有各種請求頭,在他內部我們是通過Builder構建者模式來鏈式生成Request對象

RealCall

  • 通過調用Request.newCall方法來創建一個Call對象,這個Call對象在我們的OkHttp中的實現類就是RealCall,這個RealCall代表着實際的OkHttp請求,他是連接Request和Response的一個橋樑,有了這個Call,我們才能進行下面的同步或者異步請求操作。

Dispatcher

  • 決定OkHttp的同步或者異步,Dispatcher分發器,在他的內部維護了一個線程池,這個線程池就是用於執行我們的網絡請求(同步或者異步),而我們之前創建好的RealCall對象在執行任務的時候,他會將請求添加到Dispatcher裏面,在後面的查看源碼的時候,我們會看到有三個隊列.
 /** Ready async calls in the order they'll be run. */
  private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();

  /** Running asynchronous calls. Includes canceled calls that haven't finished yet. */
  private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();

  /** Running synchronous calls. Includes canceled calls that haven't finished yet. */
  private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>();

interceptors

  • 不管是同步還是異步,在OkHttp內部他都會通過一個叫interceptors(攔截器列)的東西來進行真正的服務器數據獲取,會構建一個攔截器列,然後依次執行這個攔截器列當中的每一個攔截器來將我們服務器獲得的數據返回,也就是下面涉及到的5個攔截器
  • 攔截機制圖
    OkHttp的攔截機制

1、RetryAndFollowUpInterceptor

  • RetryAndFollowUpInterceptor這個攔截器主要負責兩部分邏輯
    • 網絡請求失敗的時候重試機制
    • 網絡請求需要進行重定向的時候會直接發起請求

2、BridgeInterceptor

  • BridgeInterceptor,橋接攔截器(主要涉及一些請求前的一些操作)
    • 設置請求內容長度,內容編碼
    • gzip壓縮
    • 添加Cookie,爲他設置其他的報頭

3、CacheInterceptor

  • CacheInterceptor負責緩存的管理
    • 網絡緩存
    • 本地緩存

4、ConnectInterceptor

  • ConnectInterceptor爲當前的請求找到一個合適連接
  • 可以複用原先已有的連接(如果這個連接是可以複用的,就不需要重新創建)
  • 還會涉及到連接池的概念

5、CallServerInterceptor

  • CallServerInterceptor他的工作就是向我們服務器發起真正的訪問請求,然後在接收到服務器返回給我們的Response響應體並返回

總結

整個的OkHttp的核心有兩大塊

  • Dispatcher
    • Dispatcher會不斷的從request這個隊列當中去獲取到他所需要的RealCall這個請求,然後根據是否調用緩存,如果有緩存就調用緩存,如果沒有緩存就進行下面的ConnectInterceptor/CallServerInterceptor服務器數據的返回,而且Dispatcher還會決定我們是否調用同步的還是異步的請求
  • interceptors
    • 不管是同步還是異步,最終都會調用攔截器進行分發

參考

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