主要參與的是 OkHttpClient、request焕梅、call、RealCall卦洽、dispatcher丘侠、interceptors、response
通過builder創(chuàng)建OkHttpClient對象 設(shè)置一些屬性 不設(shè)置的話會(huì)有默認(rèn)值 舉個(gè)例子的話 就有一些什么超時(shí)時(shí)間之類的 其實(shí)也能給設(shè)置一些攔截器逐样、比如我們改的打印日志的東西
然后創(chuàng)建一個(gè)請求 就是request 包含你的請求地址 請求方式 header body 然后把這個(gè)請求變成call 通過newCall方法
然而實(shí)際上 newCall 里面就會(huì)調(diào)用realcall的newrealcall方法 realcall是call的實(shí)現(xiàn)類 call其實(shí)是個(gè)接口
它里面會(huì)有一些 執(zhí)行請求的方法 取消的方法 還有請求結(jié)束的狀態(tài) 等等 然后realcall實(shí)現(xiàn)了他的具體方法
比較重要的就是 execute和enqueue方法 前者是同步后者是異步 然后里面實(shí)際調(diào)用的client調(diào)用dispatcher的相應(yīng)execute與enqueue方法 dispatcher里面有一些 裝請求的隊(duì)列 包括同步的正在執(zhí)行的等待執(zhí)行的 還有異步請求用到的線程池
大體邏輯就是 如果是同步請求 就直接把請求裝到runningSyncCalls里面
在這個(gè)請求方法之外 就是關(guān)鍵的責(zé)任鏈調(diào)用了 無論哪種請求都會(huì)調(diào)用同一個(gè)啟動(dòng)責(zé)任鏈的方法 getResponseWithInterceptChain
它里面就是各種攔截器的鏈路執(zhí)行了 主要由 RetryAndFollowUpInterceptor 是重連重定向攔截器 還有BridgeInterceptor 用于把我們寫的request變成服務(wù)器接受的請求 反過來也一樣 然后ConnectInterceptor 負(fù)責(zé)連接 CacheInterceptor 負(fù)責(zé)緩存 負(fù)責(zé)網(wǎng)絡(luò)設(shè)置的networkInterceptor 和最終請求的Call ServerInterceptor 最終返回請求結(jié)果 response 異步的話 是根據(jù)正在執(zhí)行的隊(duì)列有沒有空余 沒有就放到等待隊(duì)列 剩下差不多 同樣的責(zé)任鏈