前言
通過前面的兩篇文章 基礎(chǔ)篇,中級篇?我們學(xué)到了網(wǎng)絡(luò)框架的基礎(chǔ)封裝。但學(xué)完這些,你覺得已經(jīng)可以了么?這個想法在2011年還可以。
Android經(jīng)過這些年來的發(fā)展,無論是系統(tǒng)(7.0)還是UI風(fēng)格,還是底層的各種支持庫都有特別大的進(jìn)步。2013年的I/O大會谷歌宣布Volley網(wǎng)絡(luò)框架的使用。因為是官方推薦所以接下來,本文詳細(xì)介紹一下volley的理解,從架構(gòu)到模塊,從模塊到代碼。建議看視頻演講

架構(gòu)

紅框部分就是我們之前講網(wǎng)絡(luò)框架封裝涉及到的地方,1.請求 ?2.HttpUrlConnection 3.Server,仔細(xì)看看Volley做了哪些擴(kuò)展吧。
RequestQueue ? 請求隊列,隊列結(jié)構(gòu),用來管理所有HTTP的request. 想一下我們對請求根本沒有封裝,直接就付給HttpUrlConnection發(fā)起請求,這是針對請求之前做一部分工作。這些工作幫助我們管理請求順序,優(yōu)先級,重試等等,可以理解為 ?“Request Manager”
DispatchThread? 請求分發(fā)線程。NetworkDispather 用于調(diào)度走網(wǎng)絡(luò)請求的線程,CacheDispather用于調(diào)度走緩存請求的線程。是的,比如設(shè)置了數(shù)據(jù)結(jié)果緩存時間,當(dāng)緩存時間未過、緩存失效或緩存需要刷新的情況下,該請求都需要重新進(jìn)入NetworkDispatcher去調(diào)度處理。NetworkDispather啟動后會不斷從RequestQueue默認(rèn)按FIFO(先入先出)的規(guī)則取請求,進(jìn)行網(wǎng)絡(luò)線程的調(diào)度。
Get Data Interface 數(shù)據(jù)提供接口?左邊為Cache,緩存請求結(jié)果。右邊為HttpClientStack(HttpClient)與HurlStack(HttpUrlCoinnection) 所以Volley框架很好的處理了兼容性,在2.3以下默認(rèn)使用HttpClientStatck,2.3以上的版本則使用HurlStack
Data 具體的實現(xiàn)類左側(cè)為在Memory、FileSystem(默認(rèn)SdCard)數(shù)據(jù)源。右側(cè)為Network。
ResponseDelivery ?負(fù)責(zé)結(jié)果回調(diào),分發(fā)。
整個Volley的基本流程。

文字描述: 用戶創(chuàng)建一個請求,請求加入到請求隊列RequestQueue,CacheDispather判斷請求結(jié)果是否超過緩存時間,是否失效等狀態(tài),如果是則使用它去Memory,Disk中取數(shù)據(jù)。若不是則使用NetworkDispather去Network上與服務(wù)器交互取得數(shù)據(jù)。得到結(jié)果后交給ResponseDelivery來分發(fā)給上層用戶,用戶拿到結(jié)果巴拉巴拉。
官方Life of ?a request

根據(jù)以上分析,我們完整而清晰的認(rèn)識了整個Volley架構(gòu)以及每個模塊具體所有的工作。注意,Volley各角色之前皆用接口定義協(xié)議交互,所以擴(kuò)展非常好。來看下基本的類關(guān)系圖

Volley創(chuàng)建請求隊列

非常簡單,與我們的調(diào)用差不了太多。多的部分是
1.創(chuàng)建請求隊列 RequestQueue
2.請求加入到請求隊列
Volley 取消請求示例

Volley 是通過Tag來區(qū)分各個請求的。所以有時候根據(jù)需要,在界面對用戶不可見時,取消請求。
Volley使用Cache 和Netwrok

通過這種簡單方式就可以完成緩存,網(wǎng)絡(luò)設(shè)置請求
如果每次請求的時候都要new RequestQueue效率就太低了,我們通常使用單例模式,整個工程只存在一個請求隊列,請看


根據(jù)上面的學(xué)習(xí),我們來看下返回結(jié)果是JSON的調(diào)用

結(jié)合Gson更方便的幫助我們拿到實體


OK,通過以上介紹。我們已經(jīng)學(xué)會使用Volley網(wǎng)絡(luò)框架了。
如果大家對源碼非常感興趣,我的建議是,參照上面的類圖,請求生命周期圖一點點跟蹤去看。當(dāng)然了,這也是通用的看源碼的原則。
源碼注釋解讀
源碼包結(jié)構(gòu),說實話,有點亂,完全可以整理一下。

再看下toolbox

我們上面說到Volley的擴(kuò)展性非常強(qiáng)悍,現(xiàn)在證明一下。大家從上文可以了解到Volley一個request的周期。
Volley

Volley類的提供2個方法newRequestQueue ,其中有一個是重載的。我們可以清楚的看到,這里根據(jù)API選擇HurlStack或者是HttpClientStack,這個方法是public的,所以我們可以傳入自定義的HTTP客戶端(比如OkHttp)只要實現(xiàn)HttpStack接口即可。
HttpStack接口只有一個方法,兩個實現(xiàn)類

我們分別看一下底層是HttpUrlConnection 和 HttpCilent的實現(xiàn),其核心依舊是我上兩篇講的基礎(chǔ)代碼部分。

我們看下這些方法里面的內(nèi)容

可以看到這個方法設(shè)置了超時,SSL這些,所以默認(rèn)Volley不支持https的,需要創(chuàng)建HurlStack時設(shè)置一個SSLSocketFatcory 以供支持

咱來看下底層是Apache HttpClient如何實現(xiàn)這個方法的

可以看到過程其實是一樣的
所以O(shè)KHttp的替換也非常容易

Okhttp3.0 來替換更加簡單

Okhttp替換Volley客戶端?詳情請看這里