volley完全解析,volley解析

來源:互聯網
上載者:User

volley完全解析,volley解析
一、volley是什嗎?1、簡介

  Volley是Goole在2013年Google I/O大會上推出了一個新的網路通訊架構,它是開源的。從名字由來和配圖中無數急促的火箭可以看出 Volley 的特點:特別適合資料量小,通訊頻繁的網路操作。(個人認為 Android 應用中絕大多數的網路操作都屬於這種類型)。

  Volley載入圖片實現了兩級緩衝(網路緩衝、檔案快取),沒有實現記憶體的緩衝。Volley已經把各種非同步任務、圖片採樣都封裝好了。記憶體緩衝使用lrucache類實現,需要我們手動添加進去。沒有使用軟引用緩衝。因為4.0之後的android系統已經不推薦使用軟引用緩衝了。

2、volley的總體設計

3、volley可以做什麼

JSON,映像等的非同步下載;
處理get、post等網路請求;
網路請求的排序(scheduling);
網路請求的優先順序處理;
緩衝;
多層級取消請求;
和Activity和生命週期的聯動(Activity結束時同時取消所有網路請求);
等等。

二、圖片的三級緩衝在volley中的實現

  其實volley可以完全取代我們手寫的三級緩衝,因為google已經對volley進行了非常好的封裝,具體說明如下:

1、volley的推薦用法-單例模式

  使用volley時,我們推薦把volley的使用封裝成單例使用。在application中初始化它。具體代碼如下:

單例:

package com.ht.xiangqu.util;import android.content.Context;import android.graphics.Bitmap;import android.support.v4.util.LruCache;import com.android.volley.RequestQueue;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.Volley;/** * Created by annuo on 2015/6/16. */public class RequestManager {    private static RequestManager ourInstance;    private RequestQueue requestQueue;    private ImageLoader imageLoader;    public static RequestManager createInstance(Context context) {        if (context != null) {            if (ourInstance == null) {                ourInstance = new RequestManager(context);            } else {                throw new IllegalArgumentException("Context must be set");            }        }        return ourInstance;    }    public static RequestManager getInstance() {        return ourInstance;    }    private RequestManager(Context context) {        requestQueue = Volley.newRequestQueue(context);        imageLoader = new ImageLoader(                requestQueue,                new ImageLoader.ImageCache() {                    private LruCache<String, Bitmap> cache                            = new LruCache<>(20);                    @Override                    public Bitmap getBitmap(String url) {                        return cache.get(url);                    }                    @Override                    public void putBitmap(String url, Bitmap bitmap) {                        cache.put(url, bitmap);                    }                }        );    }    public RequestQueue getRequestQueue() {        return requestQueue;    }    public ImageLoader getImageLoader() {        return imageLoader;    }}

application:

package com.ht.xiangqu.util;import android.app.Application;import android.util.Log;/** * Created by annuo on 2015/6/16. */public class MainApplation extends Application {    @Override    public void onCreate() {        super.onCreate();        RequestManager.createInstance(getApplicationContext());        Log.d("nihao", "nihao");    }}
2、記憶體緩衝

  只有載入圖片的時候才會有記憶體緩衝,對於字串一般都是之後檔案快取。

  google並沒有自動的幫我們實現記憶體的緩衝,需要我們自己手動加入進去。記憶體緩衝在單例類中已經體現了(即LruCache),以後我們每次使用的時候都不必再加入記憶體緩衝。LruCache這個類是Android3.1版本中提供的,如果你是在更早的Android版本中開發,則需要匯入android-support-v4的jar包。

3、檔案快取

  volley已經預設幫我們實現了檔案的緩衝。我們通過原始碼看一下:

    /**     * Constructs a new ImageLoader.     * @param queue The RequestQueue to use for making image requests.     * @param imageCache The cache to use as an L1 cache.     */    public ImageLoader(RequestQueue queue, ImageCache imageCache) {        mRequestQueue = queue;        mCache = imageCache;    }

  以上代碼是imageloader中的一段代碼,從中我們可以看到在構造imageloader時,我們已經預設的建立了一個L1級的緩衝(檔案快取)。

那volley緩衝下來的檔案到底在哪呢?見:

  具體的位置就在的位置。即data/data/應用程式的包名/volley,如果沒有修改volley的緩衝位置,預設名字叫volley。

4、圖片的二次採樣的問題

  其實volley預設的已經幫我們做了圖片的二次採樣,只是需要我們在進行請求的時候,多加入兩個參數。我們一般都忽略了這個問題,最後導致的是不斷的OOM。

    /**     * 這是訪問網狀圖片的核心方法     * @param requestUrl     * @param imageListener     * @param maxWidth     * @param maxHeight     * @return     */    public ImageContainer get(String requestUrl, ImageListener imageListener,            int maxWidth, int maxHeight) {
        Request<?> newRequest =            new ImageRequest(requestUrl, new Listener<Bitmap>() {                @Override                public void onResponse(Bitmap response) {                    onGetImageSuccess(cacheKey, response);                }            }, maxWidth, maxHeight,            Config.RGB_565, new ErrorListener() {                @Override                public void onErrorResponse(VolleyError error) {                    onGetImageError(cacheKey, error);                }            });        mRequestQueue.add(newRequest);        mInFlightRequests.put(cacheKey,                new BatchedImageRequest(newRequest, imageContainer));        return imageContainer;    }

  以上代碼是imageloader的核心方法,其中有兩個參數是maxWidth,maxHeight,我們一般都忽略了這兩個參數。預設值是0和0,這樣二次採樣演算法就不起作用了,我們得到的圖片是從伺服器1:1哪來的。但是一般我們設定了這兩個參數,就可以得到我們希望的縮小比例的圖片。這樣就可以完全的避免OOM。

三、volley的其他問題1、圓角圖片的問題
    public static ImageListener getImageListener(final ImageView view,            final int defaultImageResId, final int errorImageResId) {        return new ImageListener() {            @Override            public void onErrorResponse(VolleyError error) {                if (errorImageResId != 0) {                    view.setImageResource(errorImageResId);                }            }            @Override            public void onResponse(ImageContainer response, boolean isImmediate) {                if (response.getBitmap() != null) {                    //在這裡可以設定,如果想得到圓角圖片的畫,可以對bitmap進行加工,可以給imageview加一個                    //額外的參數                    view.setImageBitmap(response.getBitmap());                } else if (defaultImageResId != 0) {                    view.setImageResource(defaultImageResId);                }            }        };    }
2、listview複用時,解決圖片錯位的問題
    /**     * 使用此方法能夠解決圖片錯亂問題     * @param view     * @param defaultImageResId     * @param errorImageResId     * @param url     * @return     */    public static ImageListener getImageListener(            final ImageView view,            final int defaultImageResId,            final int errorImageResId,            final String url) {        return new ImageListener() {            @Override            public void onErrorResponse(VolleyError error) {                if (errorImageResId != 0) {                    view.setImageResource(errorImageResId);                }            }            @Override            public void onResponse(ImageContainer response, boolean isImmediate) {                if (response.getBitmap() != null) {                    //在這裡可以設定,如果想得到圓角圖片的畫,可以對bitmap進行加工,可以給imageview加一個                    //額外的參數                    String urlTag = (String) view.getTag();                    if(urlTag!=null && urlTag.trim().equals(url)){                        view.setImageBitmap(response.getBitmap());                    }                } else if (defaultImageResId != 0) {                    view.setImageResource(defaultImageResId);                }            }        };    }
四、volley的具體用法

  關於這塊內容,網路上有很多的資料,總之volley使用起來非常的簡單,感興趣的可以去網路上尋找相關的資料進行學習。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.