Android網(wǎng)絡(luò)封裝(從零開始教你高級篇)

前言

通過前面的兩篇文章 基礎(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)到模塊,從模塊到代碼。建議看視頻演講


2013Google IO

架構(gòu)


Volley總體設(shè)計圖

紅框部分就是我們之前講網(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的基本流程。


Volley網(wǎng)絡(luò)請求過程


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

官方Life of ?a request


life of a request


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


Volley類關(guān)系圖



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


Volley調(diào)用實例一

非常簡單,與我們的調(diào)用差不了太多。多的部分是

1.創(chuàng)建請求隊列 RequestQueue

2.請求加入到請求隊列

Volley 取消請求示例


Volley cancel a request

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

Volley使用Cache 和Netwrok


通過這種簡單方式就可以完成緩存,網(wǎng)絡(luò)設(shè)置請求

如果每次請求的時候都要new RequestQueue效率就太低了,我們通常使用單例模式,整個工程只存在一個請求隊列,請看



單例模式


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


Volley JSON Request

結(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)這個方法的


HttpClient

可以看到過程其實是一樣的

所以O(shè)KHttp的替換也非常容易


Okhttp3.0 來替換更加簡單


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


參考

Volley源碼解讀

Volley官方地址

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

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

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