天天看點

Volley架構二次封裝

谷歌官方推出的Volley架構,實作了小資料、多頻發,以及圖檔加載的網絡操作。這友善了大家開發,但是沒有對擷取Cookie做相應的處理,使用者想要擷取的話,很麻煩,這也造成了代碼冗雜,是以為了友善大家,我就對Volley架構進行了二次封裝,當然也借鑒了網上的經驗(嘿嘿)。封裝實作了Get和Post帶Cookie的網絡請求,以及圖檔加載和圖檔緩存。

這是我的項目工程:

Volley架構二次封裝

首先你要導入Volley.jar庫

一、先來介紹網絡請求部分,這部分實作了:

1、不帶Cookie的Get方式請求網絡資料

2、帶Cookie的Get方式請求網絡資料

3、不擷取Cookie也不帶Cookie但是帶參數的Post網絡請求

4、不擷取Cookie也不帶Cookie和參數的Post網絡請求

5、帶參數的擷取Cookie的Post網絡請求

6、帶Cookie而且有參數的Post網絡請求

7、帶Cookie但是沒有參數的Post網絡請求

VolleyHelper 類

public class VolleyHelper {
    public static final int MEMORY_CACHE = ;//緩存在記憶體中
    public static final int DISK_CACHE = ;//緩存在sd卡中
    public static final int DOUBLE_CACHE = ;//記憶體和sd雙緩存

    public static void getRequest(RequestQueue requestQueue,String requestTag,String url,VolleyRequest volleyRequest){//不帶Cookie的Get方式請求網絡資料
        removeRequest(requestQueue,requestTag);
        StringRequest request = new StringRequest(Request.Method.GET,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener());
        request.setTag(requestTag);
        requestQueue.add(request);
    }

    public static void getRequestWithCookie(RequestQueue requestQueue,String requestTag,String url,final String cookie,VolleyRequest volleyRequest){//帶Cookie的Get方式請求網絡資料
        removeRequest(requestQueue,requestTag);
        StringRequest request = new StringRequest(Request.Method.GET,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap localHashMap = new HashMap();
                localHashMap.put("Cookie", cookie);
                return localHashMap;
            }
        };
        request.setTag(requestTag);
        requestQueue.add(request);
    }

    public static void postRequest(RequestQueue requestQueue,String requestTag,String url,final Map<String, String> params,VolleyRequest volleyRequest){//不擷取Cookie也不帶Cookie但是帶參數的Post網絡請求
        removeRequest(requestQueue,requestTag);
        StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };
        request.setTag(requestTag);
        requestQueue.add(request);
    }

    public static void postRequest(RequestQueue requestQueue,String requestTag,String url,VolleyRequest volleyRequest){//不擷取Cookie也不帶Cookie和參數的Post網絡請求
        removeRequest(requestQueue,requestTag);
        StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener());
        request.setTag(requestTag);
        requestQueue.add(request);
    }

    public static void postRequestGetCookie(RequestQueue requestQueue,String requestTag,String url,final Map<String, String> params,VolleyRequest volleyRequest,final CookieInterface cookieInterface){//帶參數的擷取Cookie的Post網絡請求
        removeRequest(requestQueue,requestTag);
        StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                Map<String, String> responseHeaders = response.headers;
                String cookies = responseHeaders.get("Set-Cookie");

                cookieInterface.onResposeCookie(cookies);//設定回調,這裡面不能更新UI

                return super.parseNetworkResponse(response);
            }
        };
        request.setTag(requestTag);
        requestQueue.add(request);
    }

    public static void postRequestWithCookie(RequestQueue requestQueue,String requestTag,String url,final Map<String, String> params,final String cookie,VolleyRequest volleyRequest){//帶Cookie而且有參數的Post網絡請求
        removeRequest(requestQueue,requestTag);
        StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap localHashMap = new HashMap();
                localHashMap.put("Cookie", cookie);
                return localHashMap;
            }
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };
        request.setTag(requestTag);
        requestQueue.add(request);
    }
    public static void postRequestWithCookie(RequestQueue requestQueue,String requestTag,String url,final String cookie,VolleyRequest volleyRequest){//帶Cookie但是沒有參數的Post網絡請求
        removeRequest(requestQueue,requestTag);
        StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap localHashMap = new HashMap();
                localHashMap.put("Cookie", cookie);
                return localHashMap;
            }
        };
        request.setTag(requestTag);
        requestQueue.add(request);
    }

    public static void removeRequest(RequestQueue requestQueue,String requestTag){//移除多餘的請求
        requestQueue.cancelAll(requestTag);
    }

    public static void displayImage(RequestQueue requestQueue,String imageTag,String url, final ImageView imageView,int defaultImageResId, final int errorImageResId,int imageViewWidth,int imageViewHeiget,Bitmap.Config decodeConfig){//沒有緩存的圖檔加載模式
        removeRequest(requestQueue, imageTag);

        //顯示加載中的圖檔
        imageView.setImageResource(defaultImageResId);

        ImageRequest request = new ImageRequest(
                url,
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        //設定加載成功的圖檔
                        imageView.setImageBitmap(bitmap);
                    }
                },
                imageViewWidth, imageViewHeiget, decodeConfig,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        //設定加載失敗的圖檔
                        imageView.setImageResource(errorImageResId);
                    }
                });

        request.setTag(imageTag);
        requestQueue.add(request);
    }
    public static void displayImageWithCache(RequestQueue requestQueue,String url,ImageView imageView,int defaultImageResId,int errorImageResId,int cacheMode){//可以設定緩存的圖檔加載方式
        ImageLoader imageLoader;
        switch (cacheMode){
            case MEMORY_CACHE:
                imageLoader = new ImageLoader(requestQueue, new MemoryCache());
                break;
            case DISK_CACHE:
                imageLoader = new ImageLoader(requestQueue, new DiskCache());
                break;
            case DOUBLE_CACHE:
                imageLoader = new ImageLoader(requestQueue, new DoubleCache());
                break;
            default:
                imageLoader = new ImageLoader(requestQueue, new MemoryCache());
                break;
        }
        ImageLoader.ImageListener listener = imageLoader.getImageListener(imageView,defaultImageResId,errorImageResId);
        //加載及緩存網絡圖檔
        imageLoader.get(url,listener);
    }
}
           

擷取Cookie我用是接口進行回調,

CookieInterface類

public interface CookieInterface {
    void onResposeCookie(String cookie);
}
           

PS:這裡要注意,回調實在網絡請求的子線程中進行的,是以不能在回調中進行UI更新。

二、圖檔加載子產品:

這部分分為兩種加載方式:

1、沒有緩存的圖檔加載模式:

/*requestQueue:請求隊列
    imageTag:請求标記
    url:請求位址
    imageView:顯示對象
    defaultImageResId:加載時預設顯示的圖檔id
    errorImageResId:加載失敗時顯示的圖檔id
    imageViewWidth:圖檔壓縮寬度
    imageViewHeiget:圖檔壓縮高度
    decodeConfig:圖檔存儲模式(有以下四種模式)

    Bitmap.Config ARGB_4444:每個像素占四位,即A=4,R=4,G=4,B=4,那麼一個像素點占4+4+4+4=16位 
    Bitmap.Config ARGB_8888:每個像素占四位,即A=8,R=8,G=8,B=8,那麼一個像素點占8+8+8+8=32位
    Bitmap.Config RGB_565:每個像素占四位,即R=5,G=6,B=5,沒有透明度,那麼一個像素點占5+6+5=16位
    Bitmap.Config ALPHA_8:每個像素占四位,隻有透明度,沒有顔色。*/
    public static void displayImage(RequestQueue requestQueue,String imageTag,String url, final ImageView imageView,int defaultImageResId, final int errorImageResId,int imageViewWidth,int imageViewHeiget,Bitmap.Config decodeConfig){//沒有緩存的圖檔加載模式
        removeRequest(requestQueue, imageTag);

        //顯示加載中的圖檔
        imageView.setImageResource(defaultImageResId);

        ImageRequest request = new ImageRequest(
                url,
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        //設定加載成功的圖檔
                        imageView.setImageBitmap(bitmap);
                    }
                },
                imageViewWidth, imageViewHeiget, decodeConfig,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        //設定加載失敗的圖檔
                        imageView.setImageResource(errorImageResId);
                    }
                });

        request.setTag(imageTag);
        requestQueue.add(request);
    }
           

2、設定可緩存的圖檔加載方式:

/*requestQueue:請求隊列
    url:請求位址
    imageView:顯示對象
    defaultImageResId:加載時預設顯示的圖檔id
    errorImageResId:加載失敗時顯示的圖檔id
    cacheMode:緩存模式(記憶體緩存,SD緩存,記憶體SD雙緩存)*/
    public static void displayImageWithCache(RequestQueue requestQueue,String url,ImageView imageView,int defaultImageResId,int errorImageResId,int cacheMode){//可以設定緩存的圖檔加載方式
        ImageLoader imageLoader;
        switch (cacheMode){
            case MEMORY_CACHE:
                imageLoader = new ImageLoader(requestQueue, new MemoryCache());
                break;
            case DISK_CACHE:
                imageLoader = new ImageLoader(requestQueue, new DiskCache());
                break;
            case DOUBLE_CACHE:
                imageLoader = new ImageLoader(requestQueue, new DoubleCache());
                break;
            default:
                imageLoader = new ImageLoader(requestQueue, new MemoryCache());
                break;
        }
        ImageLoader.ImageListener listener = imageLoader.getImageListener(imageView,defaultImageResId,errorImageResId);
        //加載及緩存網絡圖檔
        imageLoader.get(url,listener);
    }
           

源碼下載下傳