【Android okhttp源碼解析 二】同步請求流程和源碼分析

>okhttp源碼解析系列文章: >第一篇:《okhttp框架簡單介紹》 >https://blog.csdn.net/colinandroid/article/details/79774907 >第二篇:《同步請求流程和源碼分析》 >https://blog.csdn.net/colinandroid/article/details/79774918 >第三篇:《異步請求流程和源碼分析》 >https://blog.csdn.net/colinandroid/article/details/79774932 >第四篇:《任務調度核心類dispatcher解析》 >https://blog.csdn.net/colinandroid/article/details/79774936 >第五篇:《攔截器流程和源碼解析》 >https://blog.csdn.net/colinandroid/article/details/79706161 ####1. 創建OkHttpClient對象 ![這裏寫圖片描述](https://img-blog.csdn.net/20180326233848954?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 這裏使用Builder模式來給OkHttpClient對象的成員變量賦值,這裏最重要的兩個成員變量時***dispatcher***和***connectionPool***。其中, #####(1)***dispatcher***是一個分發器類,由它決定網絡請求是直接處理還是緩存等待,對於同步請求,這個分發器只是把同步請求放到隊列當中。 #####(2)***connectionPool***是一個連接池,客戶端和服務端之間的連接可以抽象爲一個***connection***,而每一個***connection***我們都把它放到連接池中,由它來進行統一的管理,例如,當請求的url相同時就可以選擇複用。 ####2. 創建Request對象 Request對象攜帶了請求報文的一些信息,如url地址,請求方法,請求頭等。 ![這裏寫圖片描述](https://img-blog.csdn.net/20180327000818713?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ####3. 創建Call對象 Call對象代表了一個實際的http請求。由於Call是一個接口,其實際請求都是通過RealCall來實現的。 ![這裏寫圖片描述](https://img-blog.csdn.net/20180327000919031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 我們來看下RealCall的實現 ![這裏寫圖片描述](https://img-blog.csdn.net/20180327001110581?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 首先創建一個RealCall,然後給一個監聽賦值。我們來看看RealCall的構造方法裏做了什麼 ![這裏寫圖片描述](https://img-blog.csdn.net/20180327001331086?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 可以看到RealCall持有了client對象和request對象,並初始化了一個重定向攔截器。 ####4. 執行請求 我們知道執行請求其實就是調用Call對象的execute方法,而實際調用的是RealCall的execute方法,我們來看一下。 ![這裏寫圖片描述](https://img-blog.csdn.net/20180327001604687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29saW5hbmRyb2lk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 我們這裏主要關注一下主流程,首先執行okHttpClient的dispatcher的execute()方法 ![這裏寫圖片描述](https://img-blog.csdn.net/20180328162416890?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbGluYW5kcm9pZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 我們看到,execute()方法其實就是將Call對象加入同步隊列當中,dispatcher負責請求的分發,依次去執行同步隊列裏的請求。 除了同步執行隊列runningSyncCalls,還有異步執行隊列runningAsyncCalls和異步就緒隊列readyAsyncCalls。 在執行完execute()方法後,會調用getResponseWithInterceptorChain()方法來獲取response,在這個方法裏會依次調用攔截器來進行相應操作。 這裏還要注意,在拿到response後還調用了dispatcher的finish方法。 ![這裏寫圖片描述](https://img-blog.csdn.net/20180328170028608?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbGluYW5kcm9pZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 這裏是把當前請求從runningSyncCalls隊列中移除,接着計算所有正在執行的同步請求和異步請求隊列中請求數,如果請求數爲0則回調idleCallback()方法。 可以看到,同步請求的執行方法的執行過程比較簡單,主要就是保存同步請求移除同步請求
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章