ym—— Android網絡框架Volley(終極篇)

沒看使用過Volley的同窗能夠,先看看 Android網絡框架Volley(體驗篇)Android網絡框架Volley(實戰篇)在進行本篇學習這樣會更好的理解本篇內容. java

本篇內容主要是講Volley在某些細節方面的選擇和實現.值得咱們學習的地方以及若是更好的使用Volley。 緩存


1.Volley本地緩存爲何有時候不會進行緩存? 服務器

緩存使用前提服務器必須支持,緩存,配置Cache-Control頭信息, 網絡

由於Volley須要從這些頭信息判斷緩存是否已通過期。若是已通過期Volley將會從新從網絡獲取數據。 框架

本人用抓包工具抓了沒法緩存的返回頭信息 ide

能夠支持緩存的頭信息 工具


2.若是咱們本身寫一個網絡請求框架,咱們內部實現會選擇使用HttpURLConnection仍是HttpClient? 學習

咱們經過源碼來看看Volley是如何選擇使用的 ui

  

[java]  view plain copy print ?
  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版本作去相應更優的處理方式,這樣才能達到最好的效果。 url


 3.Volley給咱們提供了ImageRrequest,ImageLoader,NetworkImageView,它們分別使用於什麼場景爲何?

單張圖片的加載能夠經過發起 ImageReuqst 請求來實現,但爲了應用內存緩存,推薦使用 ImageLoader 

NetwoekImageView專門用於批量圖片加載的場景:

[java]  view plain copy print ?
  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.     }  
  26. }  
在ListView加載多張圖片的時候,NetworkImageView能夠防止出現圖片錯誤的現象,以及當 NetworkImageView滑出屏幕的時候 會取消加載圖片請求,這樣就保證加載多張圖片的時候用戶快速滑動列表的流暢性。給用戶帶來更優的體驗。
相關文章
相關標籤/搜索