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

轉載請註明本文出自Cym的博客(http://blog.csdn.net/cym492224103)。謝謝支持!java

 

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

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


1.Volley本地緩存爲何有時候不會進行緩存?框架

緩存使用前提server必須支持。緩存,配置Cache-Control頭信息,ide

因爲Volley需要從這些頭信息推斷緩存是否已通過期。假設已通過期Volley將會又一次從網絡獲取數據。工具

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

可以支持緩存的頭信息學習


2.假設咱們本身寫一個網絡請求框架。咱們內部實現會選擇使用HttpURLConnection仍是HttpClient?ui

咱們經過源代碼來看看Volley是怎樣選擇使用的url

  

public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
    File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);
    String userAgent = "volley/0";
    try {
        String packageName = context.getPackageName();
        PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
        userAgent = packageName + "/" + info.versionCode;
    } catch (NameNotFoundException e) {
    }
    if (stack == null) {
        if (Build.VERSION.SDK_INT >= 9) {
            stack = new HurlStack();
        } else {
            stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
        }
    }
    Network network = new BasicNetwork(stack);
    RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
    queue.start();
    return queue;
}
這裏會推斷假設手機系統版本是大於9(Android 2.3)的。則建立一個HurlStack的實例,不然就建立一個HttpClientStack的實例。實際上HurlStack的內部就是使用HttpURLConnection進行網絡通信的,而HttpClientStack的內部則是使用HttpClient進行網絡通信的,這裏爲何這樣選擇呢?參考文章:Android訪問網絡。使用HttpURLConnection仍是HttpClient?這就是它爲什麼這麼快的緣由。


從這點咱們可以學習到。要針對不一樣SDK版本號作去對應更優的處理方式,這樣才幹達到最好的效果。


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

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

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

public class NetworkImageView extends ImageView {
    private String mUrl;

    // 默認顯示的圖片
    private int mDefaultImageId;

    // 載入失敗時顯示的圖片
    private int mErrorImageId;

    // 主方法入口
    public void setImageUrl(String url, ImageLoader imageLoader) {
        mUrl = url;
        mImageLoader = imageLoader;
        // 這種方法將會對ImageView的尺寸是否有效、是否爲同一張圖片進行推斷
        // 在運行新請求前,也會取消上一次在這個View裏啓動的還有一個已經失效的請求
        // 由於篇幅的限制以及代碼行數太多,這裏不貼出詳細實現的代碼
        loadImageIfNecessary(false);
    }

    // 假設圖片已經滑離屏幕。變爲不可見,將運行取消請求的操做
    @Override
    protected void onDetachedFromWindow() {
        if (mImageContainer != null) mImageContainer.cancelRequest();
        super.onDetachedFromWindow();
    }
}
在ListView載入多張圖片的時候,NetworkImageView可以防止出現圖片錯誤的現象,以及當NetworkImageView滑出屏幕的時候會取消載入圖片請求。這樣就保證載入多張圖片的時候用戶高速滑動列表的流暢性。給用戶帶來更優的體驗。
相關文章
相關標籤/搜索