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的認識會更深入,寫出的 也會更高效...