Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Volley網絡請求框架簡析——Android網絡請求框架(三)

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

編輯:關於Android編程

\

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

/**
 * 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對象

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

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

 

2、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 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() {
            @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());
            }
        });


 

3、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 map, boolean isCache, Response.Listener listener, Response.ErrorListener errorListener) {

        /**
         * 取消此標識下的所有網絡請求,避免重復提交
         */
        requestQueue.cancelAll(netTag);
        /**
         * 獲取Request對象 並封裝相應的參數
         */
        StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) {
            @Override
            protected Map 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 map = new HashMap<>();
        map.put("username", "postUsername");
        map.put("password", "postPassword");
        
        VollyRequestUtils.getInstance().asyncPostStringQuest(url, netTag, map, false, new Response.Listener() {
            @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());
            }
        });
    }

 

4、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 map, boolean isCache, Response.Listener listener, Response.ErrorListener errorListener) {

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

            if (map != null && !map.isEmpty()) {
                for (Map.Entry 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 map = new HashMap<>();
        map.put("username", "postUsername---45");
        map.put("password", "postPassword---45");
        
        VollyRequestUtils.getInstance().asynePostJsonObjRequest(url,netTag,map,false,new Response.Listener(){

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

            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });



 

5、加載圖片請求

 /**
     * 加載圖片請求
     * @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 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() {
            @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 ");
            }
        });


 


6、使用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 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);
    }

}


 

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

布局文件中的xml中使用方法

 

 
    

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);
    }


 

8、自定義Request請求

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved