1.簡單使用
同步:
1 @override public首先加鎖置標誌位,接著使用分配器的executed方法將call加入到同步佇列中,然後呼叫getresponsewithinterceptorchain方法(稍後分析)執行http請求,最後呼叫finishied方法將call從同步佇列中刪除response execute() throws ioexception
6try
finally
14 }
非同步:
1同樣先置標誌位,然後將封裝的乙個執行體放到非同步執行佇列中。這裡面引入了乙個新的類asynccall,這個類繼承於namedrunnable,實現了runnable介面。namedrunnable可以給當前的執行緒設定名字,並且用模板方法將執行緒的執行體放到了execute方法中void
enqueue(callback responsecallback, boolean forwebsocket)
6 client.dispatcher().enqueue(new
asynccall(responsecallback, forwebsocket));
7 }
2.總體架構
上圖是okhttp的總體架構,大致可以分為以下幾層:
①inte***ce——介面層:
介面層接收使用者的網路訪問請求(同步請求/非同步請求),發起實際的網路訪問。okhttpclient
是okhttp框架的客戶端,更確切的說是乙個使用者面板。使用者使用okhttp進行各種設定,發起各種網路請求都是通過okhttpclient
完成的。每個okhttpclient
內部都維護了屬於自己的任務佇列,連線池,cache,***等,所以在使用okhttp作為網路框架時應該全域性共享乙個okhttpclient
例項。
call
描述乙個實際的訪問請求,使用者的每乙個網路請求都是乙個call
例項。call
本身只是乙個介面,定義了call
的介面方法,實際執行過程中,okhttp會為每乙個請求建立乙個realcall
,每乙個realcall
內部有乙個asynccall
,asynccall
繼承的namedrunnable
繼承自runnable介面。
所以每乙個call就是乙個執行緒,而執行call的過程就是執行其execute
方法的過程。
②.protocol——協議層:處理協議邏輯
protocol層負責處理協議邏輯,okhttp支援http1/http2/websocket協議,並在3.7版本中放棄了對spdy協議,鼓勵開發者使用http/2。
③.connection——連線層:管理網路連線,傳送新的請求,接收伺服器訪問
連線層顧名思義就是負責網路連線。在連線層中有乙個連線池,統一管理所有的socket連線,當使用者新發起乙個網路請求時,okhttp會首先從連線池中查詢是否有符合要求的連線,如果有則直接通過該連線傳送網路請求;否則新建立乙個網路連線。
realconnection
描述乙個物理socket連線,連線池中維護多個realconnection例項。由於http/2支援多路復用,乙個realconnection
可以支援多個網路訪問請求,所以okhttp又引入了streamallocation
來描述乙個實際的網路請求開銷(從邏輯上乙個stream
對應乙個call
,但在實際網路請求過程中乙個call
常常涉及到多次請求。如重定向,authenticate等場景。所以準確地說,乙個stream
對應一次請求,而乙個call
對應一組有邏輯關聯的stream
),乙個realconnection
對應乙個或多個streamallocation
,所以streamallocation
可以看做是realconenction
的計數器,當realconnection
的引用計數變為0,且長時間沒有被其他請求重新占用就將被釋放。
④.cache——快取層:管理本地快取
⑤.i/o——i/o層:實際資料讀寫實現
i/o層負責實際的資料讀寫。okhttp的另一大有點就是其高效的i/o操作,這歸因於其高效的i/o庫okio
⑥inteceptor——***層:攔截網路訪問,插入攔截邏輯
***層提供了乙個類aop介面,方便使用者可以切入到各個層面對網路訪問進行攔截並執行相關邏輯。
OkHttp3原始碼(二) Request
request 是對http請求報文概念的具體實現 請求報文的結構圖 根據結構圖去閱讀原始碼能很好的理解某些屬性的真實意義。我們看一下原始碼。public final class request 返回設定的url 返回設定的方法 get或post public string method 返回所有的...
OkHttp3原始碼解析(二)OkHttp基本流程
首先使用okhttp發起乙個非同步請求,以此先簡單分析okhttp的大致流程。okhttp使用 okhttp流程主要類 功能 使用建造者模式初始化連線池,dispatcher等,為了節約資源推薦使用單列模式建立okhttpclient物件,維護執行緒池比較耗資源。http請求所需的url,請求方法等...
OkHttp3原始碼解析
compile com.squareup.okhttp3 okhttp 3.6.0 最新版本 okhttp的最底層是使用socket,而不是urlconnection,它通過platform的class.forname 反射獲得當前runtime使用的socket庫。okhttp3使用場景特點 資料...