Volley是一個封裝HttpUrlConnection和HttpClient的網絡通信架構,集AsyncHttpClient和Universal-Image-Loader的長處于了一身。既能夠像AsyncHttpClient一樣很easy地進行HTTP通信,也能夠像Universal-Image-Loader一樣輕松載入并緩存下載下傳的圖檔。Volley在性能方面也進行了大幅度的調整,它的設計目标就是進行<code>資料量不大,但通信頻繁的網絡操作</code>,而對于大資料量的網絡操作,比方說下載下傳檔案等,Volley的表現就會比較糟糕。從以下這個簡單的執行個體來研究一下源代碼。
RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
首先看一下RequestQueue這個類:
從構造函數可知,mWaitingRequests、mCurrentRequests、mCacheQueue、mNetworkQueue是以組合形式執行個體化,後兩者是堵塞隊列;而mCache、mNetwork是以聚合形式注入;mDelivery預設也是組合形式<code>new ExecutorDelivery(new Handler(Looper.getMainLooper())))</code>執行個體化。
newRequestQueue方法:
結合RequestQueue類可知,執行個體化的RequestQueue對象,注入了<code>new DiskBasedCache(cacheDir)</code>和<code>network1</code>。緩存方式預設是磁盤緩存。NetWork對象會依據系統版本号。選用不同的Http通信方式。
queue.start()方法
CacheDispatcher和NetworkDispatcher都是繼承Thread類。是以這種方法生成一條緩存分發線程,和四條網絡線程。
CacheDispatcher類繼承Thread類。全部參數都是聚合形式注入,看下關鍵的run()方法。因為代碼較長。這裡不貼了,分段分析下幾個比較重要的方法
首先任務是一個死循環,因為mCacheQueue是個堵塞隊列,是以将不斷地從堵塞隊列讀取Request
推斷請求是否有緩存。<code>假設沒有或者緩存已經過期。将請求放到網絡隊列裡面</code>。否則找到緩存。則進行以下的操作。
parseNetworkResponse是Request類的抽象方法,我們進去StringRequest看下:
可看作是對網絡下載下傳的資料進行解析處理。然後傳回。
最後進行這一步,mDelivery是在RequestQueue裡面執行個體化後注入CacheDispatcher的。詳細的執行個體化對象:new ExecutorDelivery(new Handler(Looper.getMainLooper()))。看下ExecutorDelivery類。找到postResponse方法。
> request, Response<?
<code>> response, Runnable runnable) { ... this.mResponsePoster.execute(new ExecutorDelivery.ResponseDeliveryRunnable(request, response, runnable)); }</code>
繼續往下看
deliverResponse方法相同是Request類的抽象方法,我們進去StringRequest看下
就一句回調
NetworkDispatcher類相同繼承Thread類,其分析過程和CacheDispatcher差點兒相同,重要的相同是以下幾步:
1、從網絡堵塞隊列讀取請求,request = (Request)this.mQueue.take();
2、網絡下載下傳,NetworkResponse e = this.mNetwork.performRequest(request);(假設是CacheDispatcher這一步就是緩存推斷)
3、處理下載下傳後的資料,Response response = request.parseNetworkResponse(e);
3、對處理後的資料進行回調,this.mDelivery.postResponse(e, response)。
StringRequest stringRequest = new StringRequest (url,listener,errorListener);
由第一個分析步驟能夠知道,這個Request主要就是進行兩個操作,也就是重寫兩個方法。
<code>protected abstract Response<T> parseNetworkResponse(NetworkResponse var1);</code>對下載下傳後的資料進行解析處理。
<code>protected abstract void deliverResponse(T var1);</code>最後回調操作這個資料的方法。
是以構造函數僅需下載下傳位址和回調操作的方法。
假設不須要緩存就直接加入到網絡隊列裡面,Request有個比較重要的布爾字段mShouldCache,預設是用來推斷是否要進行磁盤緩存的。
否則将其加入到緩存隊列,這種方法上面也會進行一些目前隊列和等待隊列的防反複的操作。

架構部分:
1、執行個體化一個RequestQueue對象,開啟一條緩存線程和預設的四條網絡線程,線程不斷地從緩存堵塞隊列和網絡堵塞隊列裡面讀取請求;
2、假設緩存線程從緩存隊列裡面讀取的請求已經緩存過,則解析資料回調操作方法。否則将其加入到網絡隊列;
3、假設緩存線程從緩存隊列裡面讀取的請求沒有緩存過,則加入到網絡隊列。
4、網絡線程從網絡堵塞隊列不斷讀取請求,讀到請求後則由封裝好的HttpStack對象進行網絡下載下傳處理、下載下傳後回調對資料處理的方法,處理後回調操作資料的方法。
客戶部分:
1、執行個體化一個請求對象。在請求對象裡面重寫處理網絡下載下傳後的資料的方法。和操作處理後的資料的方法。
2、将請求對象加入到請求隊列。請求須要緩存則會被加入到配置設定到緩存隊列,不須要則被加入到網絡隊列。
之前看過一個問題。說架構和庫有什麼不同,高人答曰:架構是他調用你代碼,庫是你調用他代碼。
優秀的架構拓展性是如此之強,盡管自己遠沒那個能力,隻是也算開了眼界!