從創(chuàng)建到使用:
- 創(chuàng)建一個OkHttpClient
- 構(gòu)建一個Request
- 構(gòu)建一個Call
- 最后Call回調(diào)
OkHttpClient
一開始構(gòu)建一個OKHttpClient谱醇,Builder構(gòu)建者模式资盅;里面有幾個重要參數(shù):
- 任務分發(fā)器
- 連接池
- 重試次數(shù)
- 攔截器
任務分發(fā)器
- 最多同時請求數(shù)量
- 默認 64
- 同一個host同時最多請求
- 默認 2
- 線程池
- 執(zhí)行網(wǎng)絡請求任務
- 默認最多為Integer.MAX_VALUE個線程
- 沒有核心線程
- 等待執(zhí)行隊列
- 緩沖等待
- 正在執(zhí)行隊列
- 執(zhí)行
- 執(zhí)行異步任務的時候 先判斷當前執(zhí)行任務的隊列是否超過64 ,并且當前請求的host對應的請求數(shù)是否超過2;
- 沒有就加到執(zhí)行隊列氧枣,同時放到線程池執(zhí)行;
- 執(zhí)行完成后回調(diào)回來箱硕;
- 從執(zhí)行隊列中移除該請求期揪,同時對兩個隊列進行判斷,一旦執(zhí)行隊列不到64晦款, 就從等待隊列中移除出來添加到執(zhí)行隊列炎功,同時添加到線程池執(zhí)行;
- 有就加在等待隊列缓溅;
連接池
- HttpConnection連接對象
- 使用的時候(也就是創(chuàng)建連接)蛇损,創(chuàng)建一個Socket連接,指定host和端口號;使用編碼器HttpCodec拼接參數(shù)淤齐,構(gòu)建請求體[請求行股囊、http請求頭、http請求體]更啄,然后寫出稚疹,請求;請求后返回輸入流锈死;
- 每個鏈接的最大存活時間
- 垃圾回收池
- 構(gòu)建一個線程池贫堰,當創(chuàng)建連接后,就啟動垃圾回收池待牵,判斷連接對象的最后時候時間其屏,與當前的時間差是否超過最大存存活時間,超多就銷毀一個連接對象缨该,[退出Socket連接]
- 連接對象容器
- 管理所有的連接對象偎行,超過最大存活時間就銷毀一個連接對象
重試次數(shù)
攔截器
內(nèi)部是鏈式連接的
- 自定義攔截器
- 重試攔截器
- 如果攔截失敗就重試,上面設置了重試次數(shù)贰拿,成功了就返回整個鏈維持的那個Response對象
- 頭部攔截器
- 連接攔截器
- 呼叫服務攔截器
將所有的攔截器放到一個List中蛤袒,然后創(chuàng)建一個鏈,將這個List放到鏈中膨更;鏈的長度等于List的長度妙真;鏈始終維持一個對象,那就是Response荚守;在連接攔截器中組裝所有的參數(shù)珍德,在最后的請求服務攔截器中,創(chuàng)建或者復用Socket矗漾,發(fā)出請求并獲取結(jié)果锈候。
Request
Builder模式構(gòu)造參數(shù)
- 請求頭
- 請求方式
- 請求體
- 對請求參數(shù)進行拼接存儲,供連接攔截器使用
- url封裝體
- 對一個Url解析獲取host敞贡、資源定位泵琳、協(xié)議、端口
整個Request供連接攔截器使用誊役,拼裝請求報文
- 對一個Url解析獲取host敞贡、資源定位泵琳、協(xié)議、端口
Call
構(gòu)建一個Call获列,持有Request和Client,Request蛔垢;
同步/異步回調(diào)
回調(diào)的時候击孩,構(gòu)建一個Runnable,將Callback傳到調(diào)度器的執(zhí)行方法中啦桌,callback進行回調(diào)溯壶,創(chuàng)建Runnable的時候,構(gòu)建了攔截器甫男,同時將自身傳入到了鏈中這樣鏈就持有了Call中的request且改,在構(gòu)建連接攔截器的時候就能夠拿到拼接參數(shù);Client屬性同樣在連接攔截器中用于從復用池中獲取連接對象板驳,重連攔截器中獲取重連次數(shù)又跛,以及最終執(zhí)行完成后回調(diào)分發(fā)器中的回調(diào),還有獲取傳入進來的自定義攔截器若治。