Volley網絡請求框架簡析——Android網絡請求框架(三)

題記——

        人來到這個世界上,只有兩件事情,生與死,java

        一件事完了,另外一件事還急什麼?android

        有緣而來,無緣而去,json

        識自本心,見自本性設計模式

        不起妄緣,無意無爲緩存

        自由自在,動靜自如服務器

        冷暖自知,則是修行網絡

 

一、初始化一個消息請求隊列以及網絡請求工具類對象

/**
 * Created by androidlongs on 16/7/1.
 * 網絡請求訪問框架
 */
public class VollyRequestUtils {
    /**
     * Volley框架使用工具類對象
     */
    private static VollyRequestUtils vollyRequestUtils;
    /**
     * 網絡消息請求隊列
     */
    private static RequestQueue requestQueue;
    private VollyRequestUtils() {
        /**
         * 初始化請求消息隊列
         */
        getVolleyQueyInstanse();
    }

    /**
     * 獲取消息工具類請求對象實體
     *
     * @return
     */
    public static VollyRequestUtils getInstance() {
        if (vollyRequestUtils == null) {
            synchronized (VollyRequestUtils.class) {
                if (vollyRequestUtils == null) {
                    vollyRequestUtils = new VollyRequestUtils();
                }
            }
        }
        return vollyRequestUtils;
    }

    /**
     * 獲取消息請求隊列
     */
    public void getVolleyQueyInstanse() {
        if (requestQueue == null) {
            synchronized (VollyRequestUtils.class) {
                if (requestQueue == null) {
                    requestQueue = Volley.newRequestQueue(App.getContext());
                }
            }
        }

    }

 

備註說明:框架

        這裏採用單例設計模式,其中建立請求消息隊列 requestQueue傳入的是一個Application對象 async

public class App extends Application {
    private  static Context context;
    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    }
    public static  Context getContext(){
        return context;
    }
}

切記要在程序的清單文件中引入ide

 

二、 GET網絡請求返回String 

/**
     * get 請求
     *
     * @param url           網絡請求url
     * @param netTag        網絡請求標識
     * @param isCache       設置緩存標識
     * @param listener      請求成功回調
     * @param errorlistener 請求失敗回調
     */
    public void asyGetStringRequest(String url, String netTag, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorlistener) {

        /**
         * 在發起請求前先取消隊列中有此標籤的網絡,避免屢次重複請求問題
         */
        requestQueue.cancelAll(netTag);
        /**
         * 獲取請求對象
         * 並設置相關的監聽
         */
        StringRequest request = new StringRequest(Request.Method.GET, url, listener, errorlistener);
        /**
         * 設置網絡請求標識
         */
        request.setTag(netTag);
        /**
         * 設置網絡請求緩存
         */
        request.setShouldCache(isCache);
        /**
         * 添加到隊列中
         */
        requestQueue.add(request);
    }

使用方法

final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
        final String netTag = "getString";
        
        VollyRequestUtils.getInstance().asyGetStringRequest(url, netTag, false, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                System.out.println("get String success " + s);
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                System.out.println("get String onErrorResponse " + volleyError.getMessage());
            }
        });

 

三、Post請求方式提交參數形式爲Key - Value到服務器

/**
     * post請求 提交KEY - VALEU 形式的數據
     *
     * @param url
     * @param netTag
     * @param map
     * @param isCache
     * @param listener
     * @param errorListener
     */
    public void asyncPostStringQuest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorListener) {

        /**
         * 取消此標識下的全部網絡請求,避免重複提交
         */
        requestQueue.cancelAll(netTag);
        /**
         * 獲取Request對象 並封裝相應的參數
         */
        StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                /**
                 * 封裝請求參數
                 */
                if (map != null && !map.isEmpty()) {
                    return map;
                } else {
                    return super.getParams();
                }
            }
        };
        /**
         * 設置緩存
         */
        request.setShouldCache(isCache);
        /**
         * 設置網絡請求標識
         */
        request.setTag(netTag);
        requestQueue.add(request);
    }

使用方式

final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
        final String netTag = "postString";
        
        Map<String, String> map = new HashMap<>();
        map.put("username", "postUsername");
        map.put("password", "postPassword");
        
        VollyRequestUtils.getInstance().asyncPostStringQuest(url, netTag, map, false, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                System.out.println("post String success " + s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                System.out.println("post String onErrorResponse " + volleyError.getMessage());
            }
        });
    }

 

四、post請求提交參數爲JSON形式

/**
     * 提交 JSON數據到服務器
     *
     * @param url           網絡請求URL
     * @param netTag        網絡請求標識
     * @param map           網絡請求提交參數
     * @param isCache       緩存請求標識
     * @param listener      成功監聽
     * @param errorListener 失敗監聽
     */
    public void asynePostJsonObjRequest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {

        requestQueue.cancelAll(netTag);
        /**
         * 封裝參數
         */
        JSONObject object = new JSONObject();
        try {

            if (map != null && !map.isEmpty()) {
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    object.put(entry.getKey(), entry.getValue());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        /**
         * 建立請求Request
         */
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object, listener, errorListener);
        /**
         * 設置網絡請求標識
         */
        jsonObjectRequest.setTag(netTag);
        /**
         * 設置緩存
         */
        jsonObjectRequest.setShouldCache(isCache);
        requestQueue.add(jsonObjectRequest);
    }

使用方法:

final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
        final String netTag = "postString";
        
        Map<String, String> map = new HashMap<>();
        map.put("username", "postUsername---45");
        map.put("password", "postPassword---45");
        
        VollyRequestUtils.getInstance().asynePostJsonObjRequest(url,netTag,map,false,new Response.Listener<JSONObject>(){

            @Override
            public void onResponse(JSONObject jsonObject) {
                JSONObject j = jsonObject;
            }
        },new Response.ErrorListener(){

            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });

四、Volley的ImageRequest加載圖片請求

/**
     * 加載圖片請求
     * @param url            加載圖片的URL
     * @param netTag         加載圖片的網絡請求標識
     * @param imageMaxWidth  加載圖片的最大寬度
     * @param imageMaxHeight 加載圖片的最大高度
     * @param listener       加載成功監聽
     * @param errorListener  加載失敗監聽
     */
    public void asyPostImageRequest(String url, String netTag, int imageMaxWidth, int imageMaxHeight, Response.Listener<Bitmap> listener, Response.ErrorListener errorListener) {
        requestQueue.cancelAll(netTag);

        /**
         * 建立獲取request
         * 並設置相關的監聽與參數
         */

        ImageRequest request = new ImageRequest(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX, Bitmap.Config.ARGB_8888, errorListener);

        /**
         * 設置加載緩存
         */
        request.setShouldCache(true);
        /**
         * 設置網絡請求標識
         */
        request.setTag(netTag);
        /**
         * 設置請求超時時間
         */
        request.setRetryPolicy(new DefaultRetryPolicy(15000,3000,3000));
        requestQueue.add(request);
    }

使用方法

final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";
        final String netTag = "imagerequest";
        
        VollyRequestUtils.getInstance().asyPostImageRequest(url, netTag, screeWidht, screeHeight, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
                System.out.println("image request success ");
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                System.out.println("image request faile ");
            }
        });

 

五、使用Volley內置ImageLoader來加載圖片

/**
     * 加載多張圖片
     *
     * @param url
     * @param imageView
     * @param imageMaxWidth
     * @param imageMaxHeight
     */
    public void asyVolleyImageLoaderRequest(String url, ImageView imageView, int imageMaxWidth, int imageMaxHeight) {
        ImageLoader imageLoaderInstance = getImageLoaderInstance();
        // getImageListener(imageView控件對象,默認圖片地址,失敗圖片地址);
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
        // get(圖片地址,listener,寬,高);自動幫你處理圖片的寬高不再怕大圖片的oom了
        imageLoaderInstance.get(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX);
    }

    private static ImageLoader imageLoader;

    /**
     * 獲取 Imageloader對象 
     * @return
     */
    private ImageLoader getImageLoaderInstance() {
        if (imageLoader == null) {
            synchronized (VollyRequestUtils.class) {
                if (imageLoader == null) {
                    imageLoader = new ImageLoader(requestQueue, new BitmapLruCache());
                }
            }
        }
        return imageLoader;
    }

使用方法

final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";
        final String netTag = "postString";
        
        VollyRequestUtils.getInstance().asyVolleyImageLoaderRequest(url, imageView, screeWidht, screeHeight);

在這裏使用到了一個緩存對象類

public class  BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
    /**
     * LruCache 原理:Cache保存一個強引用來限制內容數量,每當Item被訪問的時候,此Item就會移動到隊列的頭部。 
     * 當cache已滿的時候加入新的item時,在隊列尾部的item會被回收。
     * 解釋:當超出指定內存值則移除最近最少用的圖片內存
     */
    public static int getDefaultLruCacheSize() {
        // 拿到最大內存
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        // 拿到內存的八分之一來作圖片內存緩存
        final int cacheSize = maxMemory / 8;

        return cacheSize;
    }

    public BitmapLruCache() {
        this(getDefaultLruCacheSize());
    }

    public BitmapLruCache(int sizeInKiloBytes) {
        super(sizeInKiloBytes);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight() / 1024;
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }

}

六、使用Volley提供的NetworkImageView加載圖片

佈局文件中的xml使用

<com.android.volley.toolbox.NetworkImageView
        android:layout_marginTop="10dp"
        android:id="@+id/network_image_view"
        android:layout_width="100dp"
        android:layout_height="100dp" />

java代碼中的操做

/**
     * 這個控件在被從父控件detach的時候,會自動取消網絡請求的,即徹底不用咱們擔憂相關網絡請求的生命週期問題,並且NetworkImageView還會根據你對圖片設置的width和heigh自動壓縮該圖片不會產生多的內存,還有NetworkImageView在列表中使用不會圖片錯誤
     *
     * @param iv
     * @param url
     */
    private void networkImageViewUse(NetworkImageView iv, String url) {
        ImageLoader imLoader = new ImageLoader(Volley.newRequestQueue(App.getContext()), new BitmapLruCache());
        iv.setDefaultImageResId(android.R.drawable.ic_menu_rotate);
        iv.setErrorImageResId(android.R.drawable.ic_delete);
        iv.setImageUrl(url, imLoader);
    }

七、自定義Request請求

相關文章
相關標籤/搜索