OkHttp 任務調(diào)度 Dispatcher 源碼分析

image
我們在前面的同步異步請求源碼分析中經(jīng)常會到 Dispatcher 類中去調(diào)用一些方法。


OkHttp如何實現(xiàn)同步異步請求的呢?

發(fā)送的同步/異步的請求都會在 Dispatcher 中管理其狀態(tài)

到底什么是Dispatcher?

Dispatcher 的作用為維護同步/異步請求的狀態(tài),同時它在它的內(nèi)部維護一個線程池,用于執(zhí)行相應的請求。

我們?nèi)タ?Dispatcher 的源碼 ===>


image.png

上面的源碼我們看到很多次了

  • runningSyncCalls 正在執(zhí)行的同步請求隊列
  • runningAsyncCalls 正在執(zhí)行的異步請求隊列,并且包含了已經(jīng)取消但沒執(zhí)行完成的異步請求
  • readyAsyncCalls 就緒的異步請求隊列,當我們整個的異步請求不滿足一個條件的是時候,它就會進入到我們就緒的異步請求隊列中,來進行緩存,如果當條件在滿足了之后,就會把就緒的異步請求隊列放到正在執(zhí)行的異步請求隊列中去執(zhí)行。
  • executorService 線程池,這個線程池正是dispatcher中維護了整個異步之間的請求和高效的網(wǎng)路操作


先去同步請求中 Dispatcher 調(diào)用的管理

通過同步請求代碼流程找到


image.png

最后到 dispatcher 中的 executed() 方法和 finished() 方法中去看看


image.png

image.png

可以看到再同步請求中 dispatcher 就只做了兩件事:

1.直接將同步請求加入到正在執(zhí)行的同步請求隊列中(不會像異步請求添加到請求隊列會考慮一些情況)
2.將同步請求移除到正在執(zhí)行的同步請求隊列

異步請求中 Dispatcher 調(diào)用的管理

通過異步請求代碼流程找到


image.png

可以知道是到了 dispatcherenqueue() 方法中


image.png

同時我們再去看看 dispatcher 中線程池 executorService()的創(chuàng)建方法中看看


image.png

這里細細的想了想,dispatcher 就是維護我們的請求隊列,在異步中它維護了一個線程池 executorService 用于執(zhí)行異步的網(wǎng)絡請求。當請求滿足 enqueue() 方法中 if 的條件的時候,dispatcher就會直接將異步請求放入正在執(zhí)行的異步請求隊列中。并且調(diào)用線程池來執(zhí)行開啟任務。 如果不滿足就把異步請求放入到緩存的異步請求隊列中,等到條件滿足再將異步請求放入正在執(zhí)行的異步請求隊列中去。

我們再看最后一個


image.png

image.png

在異步和同步 中不管請求怎么樣都會去執(zhí)行 dispatcher 中的 finished()方法
我們就去看看 這個方法


image.png

最后在異步請求會多調(diào)用一個方法 promoteCalls() 我們?nèi)タ纯?br>

image.png

這下就明白 為什么只有 異步請求 才會去調(diào)用這個調(diào)整異步請求隊列的方法。
好了,這就是 dispatcherOkHttp 中所做的所有內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容