工作分析:
1、創(chuàng)建Call
同步:
2、將Call直接添加到Dispatcher的runningAsyncCalls隊列中,同時
3、調(diào)用getResponseWithInterceptorChain進入鏈式工作流程
4、將Response返回給調(diào)用者
5、調(diào)用Dispatcher的finish移除該Call,并調(diào)用promoteCalls檢查隊列,執(zhí)行等待的請求
異步
2、將使用Callback為參數(shù)創(chuàng)建AsyncCall對象,并將其添加到Dispatcher的隊列中,等待隊列執(zhí)行
3、隊列中取出待執(zhí)行的請求,使用線程池執(zhí)行AsyncCall(繼承Runnable),執(zhí)行g(shù)etResponseWithInterceptorChain,并將結(jié)果通過callback返回
Dispatcher中的三個隊列:
- readyAsyncCalls:準備運行的異步請求
- runningAsyncCalls:正在運行的異步請求
- runningSyncCalls:正在運行的同步請求
getResponseWithInterceptorChain中攔截器的工作分析
鏈的工作流程:
1、在getResponseWithInterceptorChain創(chuàng)建鏈條,并執(zhí)行proceed方法 (圖2所示)
2、在鏈條的proceed方法中,取出攔截器,并調(diào)用攔截器的intercept方法(圖3所示)
3、intercept方法中,對請求進行處理,然后通過鏈條的proceed獲取返回(圖4所示)
4、此時的鏈條的index已經(jīng)加1,proceed中拿到下一個攔截器,然后執(zhí)行第3步;如此遞歸到最后一個攔截器執(zhí)行第5步
5、最后一個攔截器獲取到返回之后,依次遞歸,每個攔截器去處理返回的response,然后返回給上一個攔截器處理
6、執(zhí)行到最后回到第一個鏈的起點,把數(shù)據(jù)返回給對應(yīng)的調(diào)用(圖2的retrun)



對于每個攔截器的功能可以查看上一篇文章OKHttp -- 結(jié)構(gòu)分析