volley介紹08

-----------------------------------------------------------------------------------java

轉載:http://blog.csdn.net/crazy__chen/article/details/46612901android

-----------------------------------------------------------------------------------數組

在上篇文章中,咱們最終經過網絡,獲取到了HttpResponse對象緩存

HttpResponse是android包裏面的一個類,而後爲了更高的擴展性,咱們在BasicNetwork類裏面看到,Volley將其包裝成一個Volley本身的對象NetworkResponse網絡

另外,在BasicNetwork類中咱們也注意到,對HttpResponse包裝成NetworkResponse的過程當中,使用HttpResponse的Inputstream,將數據保存在一個byte[]數組中。this

BasicNetwork代碼片斷:spa

 

[java]  view plain  copy
 
  1. // Some responses such as 204s do not have content.  We must check.    
  2.                if (httpResponse.getEntity() != null) {//返回響應主體    
  3.                  responseContents = entityToBytes(httpResponse.getEntity());//將主體轉換byte[]形式    
  4.                } else {//沒有返回內容    
  5.                  // Add 0 byte response as a way of honestly representing a    
  6.                  // no-content request.    
  7.                  responseContents = new byte[0];    
  8.                }    

這樣可能形成的一個問題,就是內存溢出,這也是Volley之因此不能用來下載大文件的緣由,由於byte[]是保存在內存中的。.net

 

 

好了,下面讓咱們來看NetworkResponse的源碼設計

 

[java]  view plain  copy
 
  1.      /**  
  2.      * The HTTP status code. 
  3.      * http狀態碼  
  4.      */  
  5.     public final int statusCode;  
  6.   
  7.     /**  
  8.      * Raw data from this response. 
  9.      * 數據  
  10.      */  
  11.     public final byte[] data;  
  12.   
  13.     /**  
  14.      * Response headers. 
  15.      * 響應頭  
  16.      */  
  17.     public final Map<String, String> headers;  
  18.   
  19.     /**  
  20.      * True if the server returned a 304 (Not Modified). 
  21.      * 網頁是否修改.304  
  22.      */  
  23.     public final boolean notModified;  
  24.   
  25.     /**  
  26.      * Network roundtrip time in milliseconds. 
  27.      * 響應時間  
  28.      */  
  29.     public final long networkTimeMs;  
  30.   
  31. /** 
  32.      * Creates a new network response. 
  33.      * @param statusCode the HTTP status code 
  34.      * @param data Response body 
  35.      * @param headers Headers returned with this response, or null for none 
  36.      * @param notModified True if the server returned a 304 and the data was already in cache 
  37.      * @param networkTimeMs Round-trip network time to receive network response 
  38.      */  
  39.     public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers,  
  40.             boolean notModified, long networkTimeMs) {  
  41.         this.statusCode = statusCode;  
  42.         this.data = data;  
  43.         this.headers = headers;  
  44.         this.notModified = notModified;  
  45.         this.networkTimeMs = networkTimeMs;  
  46.     }  


本質上沒有什麼特別的,只是將HttpResponse的內容,簡單地轉移到NetworkResponse中code

 

 

接下來,在響應分發過程當中,request負責把NetworkResponse又包裝成Response<T>對象

NetworkDispatcher代碼片斷:

 

[java]  view plain  copy
 
  1. // Parse the response here on the worker thread. 解析網絡響應到本地  
  2.                 Response<?> response = request.parseNetworkResponse(networkResponse);  

至於怎麼解析,不一樣的request應該有本身的實現。

 

 

可能看到這裏你們有些迷糊,緣由是咱們找回了以前類的一些代碼

在前面的解析中,咱們老是忽略這些片斷,默認爲全都是Response,由於在前面的過程當中,理解Response之間的不一樣會給咱們理解核心代碼帶來困擾,因此咱們都跳過了。

如今源碼解析接近尾聲,咱們再回頭看各類各樣的Response就豁然開朗了。

httpStack得到的是HttpResponse,因爲HttpResponse是android的內置類,咱們使用起來很是不靈活(由於咱們但願response都是同樣的,不管是從緩存中取的仍是網絡請求的)

根據上述緣由,咱們有了NetworkResponse,這個表明網絡請求相應,這是Volley的自定義類,這樣咱們使用起來就靈活了(理論上緩存也應該有一個CacheResponse,然而Volley沒有這樣設計)。更加劇要的一點是NetworkResponse中的byte[]數組保存了網絡數據(前面說過,這是形成內存溢出的緣由)

最後,爲了統一全部的Response,咱們將NetworkResponse(理論上還有一個CacheResponse)又封裝成了了Response<T>

 

OK,Volley解析基本到這裏就結束了。接下來的文章,將會帶你們看一下Volley最後的一部分小花絮,關於圖片加載的部分。

另外,我還會根據本身的理解,帶你們來改造Volley,使之有更多更完善的功能。

相關文章
相關標籤/搜索