ym—— Android網路架構Volley(終極篇)

來源:互聯網
上載者:User

標籤:android   style   blog   http   io   color   os   ar   使用   

1.Volley本機快取為什麼有時候不會進行緩衝?

緩衝使用前提伺服器必須支援,緩衝,配置Cache-Control頭資訊,

因為Volley需要從這些頭資訊判斷緩衝是否已經到期。如果已經到期Volley將會重新從網路擷取資料。

本人用抓包工具抓了無法緩衝的返回頭資訊

可以支援緩衝的頭資訊


2.如果我們自己寫一個網路請求架構,我們內部實現會選擇使用HttpURLConnection還是HttpClient?

我們通過源碼來看看Volley是如何選擇使用的

  

[java] view plaincopyprint?
  1. public static RequestQueue newRequestQueue(Context context, HttpStack stack) {  
  2.     File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);  
  3.     String userAgent = "volley/0";  
  4.     try {  
  5.         String packageName = context.getPackageName();  
  6.         PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);  
  7.         userAgent = packageName + "/" + info.versionCode;  
  8.     } catch (NameNotFoundException e) {  
  9.     }  
  10.     if (stack == null) {  
  11.         if (Build.VERSION.SDK_INT >= 9) {  
  12.             stack = new HurlStack();  
  13.         } else {  
  14.             stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));  
  15.         }  
  16.     }  
  17.     Network network = new BasicNetwork(stack);  
  18.     RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);  
  19.     queue.start();  
  20.     return queue;  
  21. }  

這裡會判斷如果手機系統版本號碼是大於9(Android 2.3)的,則建立一個HurlStack的執行個體,否則就建立一個HttpClientStack的執行個體。實際上HurlStack的內部就是使用HttpURLConnection進行網路通訊的,而HttpClientStack的內部則是使用HttpClient進行網路通訊的,這裡為什麼這樣選擇呢?參考文章:Android訪問網路,使用HttpURLConnection還是HttpClient?這就是它為何這麼快的原因。

從這點我們可以學習到,要針對不同SDK版本做去相應更優的處理方式,這樣才能達到最好的效果。


 3.Volley給我們提供了ImageRrequest,ImageLoader,NetworkImageView,它們分別使用於什麼情境為什嗎?

單張圖片的載入可以通過發起請求來實現,但為了應用記憶體緩衝,推薦使用 ImageLoader 

NetwoekImageView專門用於批量圖片載入的情境:

 

[java] view plaincopyprint?
  1. public class NetworkImageView extends ImageView {  
  2.     private String mUrl;  
  3.   
  4.     // 預設顯示的圖片  
  5.     private int mDefaultImageId;  
  6.   
  7.     // 載入失敗時顯示的圖片  
  8.     private int mErrorImageId;  
  9.   
  10.     // 主方法入口  
  11.     public void setImageUrl(String url, ImageLoader imageLoader) {  
  12.         mUrl = url;  
  13.         mImageLoader = imageLoader;  
  14.         // 這個方法將會對ImageView的尺寸是否有效、是否為同一張圖片進行判斷  
  15.         // 在執行新請求前,也會取消上一次在這個View裡啟動的另一個已經失效的請求  
  16.         // 由於篇幅的限制以及程式碼數太多,這裡不貼出具體實現的代碼  
  17.         loadImageIfNecessary(false);  
  18.     }  
  19.   
  20.     // 如果圖片已經滑離螢幕,變為不可見,將執行取消請求的操作  
  21.     @Override  
  22.     protected void onDetachedFromWindow() {  
  23.         if (mImageContainer != null) mImageContainer.cancelRequest();  
  24.         super.onDetachedFromWindow();  
  25.     }  

在ListView載入多張圖片的時候,NetworkImageView可以防止出現圖片錯誤的現象,以及當NetworkImageView滑出螢幕的時候會取消載入圖片請求,這樣就保證載入多張圖片的時候使用者快速滑動列表的流暢性。給使用者帶來更優的體驗。

ym—— Android網路架構Volley(終極篇)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.