Okhttp深入理解及原始碼解析

2021-08-23 12:23:00 字數 2280 閱讀 7767

okhttpclient okhttpclient = new okhttpclient();              // 第一行**

request request = new request.builder().url("url").build(); // 第二行**

call call = okhttpclient.newcall(request); // 第三行**

1)建立 okhttpclient 物件通過new okhttpclient()生成乙個okhttpclient物件,在其帶引數builder的構造方法初始化一些引數(diapatcher、interceptor……)

2)發起 http 請求

okhttpclient實現了call.factory,負責根據請求建立新的call通過鏈式呼叫生成乙個request物件(url、requestmethod、requestheader、requestbody)

檢查這個 call 是否已經被執行了,每個 call 只能被執行一次,如果想要乙個完全一樣的 call,可以利用call#clone方法進行轉殖。

利用client.dispatcher().executed(this)來進行實際執行,dispatcher是剛才看到的okhttpclient.builder的成員之一,

呼叫getresponsewithinterceptorchain()函式獲取 http 返回結果

最後還要通知dispatcher自己已經執行完畢。

interceptor是最核心的乙個東西,不要誤以為它只負責攔截請求進行一些額外的處理(例如 cookie),實際上它把實際的網路請求、快取、透明壓縮等功能都統一了起來,每乙個功能都只是乙個interceptor,它們再連線成乙個interceptor.chain,環環相扣,最終圓滿完成一次網路請求。

3)建立連線:connectinterceptor

4)傳送和接收資料:callserverinterceptor

向伺服器傳送 request header;

如果有 request body,就向伺服器傳送;

讀取 response header,先構造乙個response物件;

如果有 response body,就在 3 的基礎上加上 body 構造乙個新的response物件;

核心工作都由httpcodec物件完成,而httpcodec實際上利用的是 okio,而 okio 實際上還是用的socket

5)返回資料的獲取

每個 body 只能被消費一次,多次消費會丟擲異常;

body 必須被關閉,否則會發生資源洩漏

1)多路復用機制

okhttp 請求之前會先從 connectionpool 中獲取 connection 物件,如果能獲取到,則不會新建;如果獲取失敗,就呼叫 createnextconnection( ) 方法建立物件。 

2)重連機制

call 傳送請求時,判斷是否能 getrespose,如果不能,執行 recover,死迴圈獲取直到重連

1)單例模式 

內部維護了乙個單例執行緒池。 

2)builder 模式 

生成 okhttpclient 和 request 物件都使用 builder 模式。 

3)interceptor 責任鏈模式 

***(interceptor)內部使用。

Promise原始碼深入理解

promise的第一版實現 function mypromise constructor function reject reason 捕獲構造異常 try catch e mypromise.prototype.then function onfullfilled,onrejected var p...

深入理解AQS原始碼解析一

三 最後小結一下 一 概念 我們談到併發,就不得不談reentrantlock鎖 而談到reentrantlock鎖,不得不談一下abstractqueuedsynchronized aqs 類如其名,抽象的佇列式的同步器,aqs定義了一套多執行緒訪問共享資源的同步器框架,許多同步類實現都依賴於它,...

深入理解PHP之原始碼目錄結構

php之所以能在web開發語言中排名靠前,不僅僅是因為語法簡單,上手容易。我個人認為更多是因為其語言本身的 模組的易擴充套件性,可維護性以及記憶體安全管理等特點。寫過php的程式設計師不一定都知道 php是如何執行的?其組織結構目錄的作用?如果對其有所了解,對php的認識會更深入,寫出的 也會更高效...