天天看點

Volley架構源碼淺析(一)

尊重原創

       從今天開始,我打算為大家呈現關于Volley架構的源碼分析的文章,Volley架構是Google在2013年釋出的,主要用于實作頻繁而且粒度比較細小的Http請求,在此之前Android中進行Http請求通常是使用HttpUrlConnection和HttpClient進行,但是使用起來非常麻煩,而且效率比較地下,我想谷歌正式基于此種原因釋出了Volley架構,其實出了Volley架構意外,也有一些http請求開源項目,比如使用比較廣泛的有async-http,UniversImageLoader等等,其中async-http主要用來實作異步http請求,而後者主要用來請求圖檔。Volley具有以上兩種架構的功能,并且是Google公司釋出,我想作為Android開發者,很有必要研究一下該架構。

1、下載下傳Volley架構

git clone https://android.googlesource.com/platform/frameworks/volley

2、引用Volley架構

引用該架構的方式主要有兩種:

(1):直接導入Volley架構,作為lib使用

(2):編譯Volley成jar包

3、Volley的功能:

前面已經提及了Volley是一個用于http請求的架構,其主要功能如下:

json,xml,String,Image等資源的請求,當然我們還可以根據自己的需要來改寫Volley架構源碼,進而實作自己的功能

4、Volley源碼分析

溫馨提醒:如果是第一次看Volley源碼,第一遍沒看懂沒關系,将源碼copy下來,跟着我的思路慢慢分析,将文章從頭到後多看幾遍就ok了,因為Volley的一些關鍵類都互相應用,我隻能一個一個的分析了,等你看完我所有的文章,然後再從頭看一變,相信你定有所收獲

當然閱讀次文章之前,最好學會知道Volley架構的基本使用,由于網絡上很多類似的教程,我在此處就不再描述了,後期如果有時間我也會講解一下Volley的應用

我們就從Volley這個類開始吧

(1) Volley.java

Volley類主要用來建立一個請求隊列,我們的任何請求(請求字元串,json,xml)都放入到這個隊列中(其實裡面有兩個隊列,後面我們慢慢學習,暫時簡單了解為一個)。建立完隊列後,調用start方法,就會啟動一些線程(暫時不關注多少條線程),不斷監聽隊裡裡面是否有請求,如果有請求則執行http請求,在2.3之前的版本中,Http請求是通過httpClient實作,在2.3以後的版本中是通過HttpURLConnection實作,因為在2.3之前的版本中HttpRlConnection非常不穩定

(2) HttpStack.java

下面看看HttpStack是何方神聖

直接檢視它的子類方法吧

首先看  HurlStack.java類

這個類是基于HttpURLConnection實作的

由于這個類比較長,我就重點講解一下

(3) HurlStack.java

(4) HttpClientStack.java

看到這裡大家肯定覺得這個架構也沒有什麼了不起嘛,和使用HttpURLConnection和HttpClient差不多嘛,如果你真的這樣覺得那麼你就大錯特錯了,其實這個架構的核心在于線程的排程和緩存上面,後期我們會介紹的

回到Volley類,我們看下一個陌生的類就是Network,其實Network不過是個接口而已,它的實作類是BaskNetwork

(5) BaskicNetwork.java

從名字我們就可以看出來,這個類就是進行網絡請求的,其實他就是對HttpurlStack或者HttpClientStack的一個封裝,真正實作請求的還是上面兩個類。

最核心的方法:

這個方法調用了mHttpStack的同名方法,隻不過在mHttpStack中傳回的是HttpResponse,在這裡傳回的是NetworkResponse。

然後再看看本篇文章的最後一個類:

RequestQueue.java

我保留了一些關鍵字段,删除不影響了解的字段

寫到這裡先高一段落吧,來個小小的總結:Volley中有一個RequestQueue(包含本地隊列和網絡隊列),就是請求隊列,每一個http請求都被封裝成了一個Request,通過隊列的add方法加入隊列,如果一個Request可以緩存,那麼先加入本地隊列,如果不能緩存則加入網絡隊列

待續。。。。。。。

歡迎留言讨論。。。

繼續閱讀