Android網絡編程系列之Volley總結

前言

Volley的中文翻譯爲「齊射、併發」,是在2013年的Google大會上發佈的一款Android平臺網絡通訊庫,具備網絡請求的處理、小圖片的異步加載和緩存等功能,可以幫助 Android APP 更方便地執行網絡操做,並且更快速高效。在Google IO的演講上,其配圖是一幅發射火弓箭的圖,有點相似流星。這表示,Volley特別適合數據量不大可是通訊頻繁的場景html

1.Volley特色

  • 適用於頻繁請求而每次請求數據量不會很大;
  • 在請求的基礎上作了磁盤緩存;
  • 防止屢次相同請求浪費資源;
  • 提供String、Json、圖片異步下載;
  • 網絡請求的優先級處理;
  • 圖片請求無需擔憂生命週期問題。
  • 和Activity和生命週期的聯動(Activity結束時同時取消全部網絡請求)

2.Volley的使用

(1)新建一個RequestQueuejava

RequestQueue mQueue = Volley.newRequestQueue(context); 

(2)建立一個StringRequest實例(Volley提供,StringRequest、ImageRequest、JsonRequest)android

StringRequest stringRequest = new StringRequest("http://www.baidu.com",  
	new Response.Listener<String>() {  
		@Override  
		public void onResponse(String response) {  
			Log.d("TAG", response);  
		}  
	}, new Response.ErrorListener() {  
		@Override  
		public void onErrorResponse(VolleyError error) {  
			Log.e("TAG", error.getMessage(), error);  
		}  
	});

咱們能夠設置請求的方式json

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener); 

一樣能夠設置提交的參數緩存

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {  
    @Override  
    protected Map<String, String> getParams() throws AuthFailureError {  
        Map<String, String> map = new HashMap<String, String>();  
        map.put("params1", "value1");  
        map.put("params2", "value2");  
        return map;  
    }  
};

(3)將XXXRequest對象添加進隊列中網絡

mQueue.add(stringRequest); 

(4)調用RequestQueue的start方法就能夠開始一條網絡請求併發

mQueue.start();

3.Volley例子

(1)StringRequest請求

GET請求app

//1.建立出請求隊列
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
//2.建立出來字符串請求對象: StringRequest
    /**
    * 1param: 請求方式 get/post(get方法默認省略)
    * 2p:請求的url地址
    * 3p:請求成功後的接口回調
    * 4p:請求失敗後回調
    * 5p:成功的監聽,經過參數返回請求到的數據
    * 6p:失敗的監聽,失敗在這裏處理
    */
    StringRequest mStrReq = new StringRequest(Request.Method.GET, "https://www.baidu.com",
        new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                // 這個方法運行在主線程中,能夠直接更新ui
                // 經過參數返回請求到的數據
                mTv_result.setText(response);
                Toast.makeText(StrReqActivity.this, "下載成功", Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // 這個方法運行在主線程中,能夠直接更新ui
                // 失敗在這裏處理
                Toast.makeText(StrReqActivity.this, "下載失敗", Toast.LENGTH_SHORT).show();
            }
        });
        //設置Tag值
        mStrReq.setTag("100");
        btn_req.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //3.把請求對象添加到請求隊列中,會自動發出請求
                mRequestQueue.add(mStrReq);
            }
        });

POST請求框架

String url_post = "http://zhushou.72g.com/app/gift/gift_list/";
StringRequest mStrReq = new StringRequest(Request.Method.POST, url_post
    , new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //
        }
    }) {//這裏須要重寫getParams方法 
       @Override
       protected Map<String, String> getParams() throws AuthFailureError {
           //把post的請求參數,放入請求體中
           //請求條件:platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48
           Map<String, String> params = new HashMap<>();
           params.put("platform", "2");
           params.put("gifttype", "1");
           params.put("compare", "60841c5b7c69a1bbb3f06536ed685a48");
           return params;
        }
    };
    //點擊加入到請求隊列中
    btn_req_json.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mRequestQueue.add(mStrReq);
        }
   });

Volley支持手動/自動取消請求,能夠在Activity銷燬的時候手動取消請求:異步

@Override
protected void onDestroy() {
    super.onDestroy();
    //取消請求:有三種方式
    //1. 取消對應的請求對象
    mStrReq.cancel();
    //2. 取消請求隊列中對應tag的請求
    //mRequestQueue.cancelAll("100");
    //3. 取消請求隊列中全部的請求
    //mRequestQueue.cancelAll(this);
}

(2)JsonObjectRequest與JsonArrayRequest(json數據請求)

JsonObjectRequest請求(同樣要加到請求隊列中才會自動加載)返回的是一個JSONObject對象,建立方法以下:

JsonObjectRequest jsonObjectRequest =new JsonObjectRequest(Request.Method.GET, url, 
    new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) {          // } },
    new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) {          // } });

(3)ImageRequest圖片請求

//1.首先有請求隊列
RequestQueue requestQueue = Volley.newRequestQueue(this);
//2.請求對象
//1p 圖片下載的url
//2p 下載成功後,返回一個bitmap對象
//3p4p 最大寬度和最大高度,若是超過最大寬度和高度,會進行壓縮到你設置的寬度和高度,0不限制
//5p 圖片加載的形式
//6p圖片顯示的質量:RGB_565: 每一個像素2字節   ARGB_8888:每一個像素佔4個字節
//7p下載圖片失敗後,在這裏邊處理
ImageRequest imgRequest = new ImageRequest(url_img, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                //顯示成功的圖片
                iv_show.setImageBitmap(response);
            }
        }, 0, 0, ImageView.ScaleType.FIT_XY, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //設置失敗的圖片
                iv_show.setBackgroundResource(R.mipmap.ic_launcher);
            }
        });

(4)Volley的初步封裝

package com.alex.week06_02.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;
import com.alex.week06_02.BitmapCache;
import com.android.volley.AuthFailureError;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.Map;

/**
 * 單例模式對Volley進行簡單封裝
 * @author noonecode
 */
public class VolleyUtils {

    private static VolleyUtils mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private ImageLoader.ImageCache mCache;

    private VolleyUtils(Context context) {
        mRequestQueue = Volley.newRequestQueue(context);
        mCache = new BitmapCache();
        mImageLoader = new ImageLoader(mRequestQueue, mCache);
    }
    //單例模式
    public VolleyUtils newInstance(Context context) {
        if (mInstance == null) {
            synchronized (VolleyUtils.class) {
                if (mInstance == null) {
                    mInstance = new VolleyUtils(context);
                }
            }
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        return mRequestQueue;
    }

    public ImageLoader getImageLoader(){
        return mImageLoader;
    }

    /**
     * 發送一個字符串請求
     * @param method 請求方式GET/POST
     * @param url 請求的連接
     * @param params POST請求時的參數,可爲null
     * @param listener 請求返回數據的監聽器
     * @param errorListener 請求發生錯誤的監聽器
     */
    public void sendStringRequest(final int method, String url, final Map<String, String> params, Response.Listener<String> listener,
                                  Response.ErrorListener errorListener){
        StringRequest stringRequest = new StringRequest(method, url, listener, errorListener){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                if (method == Method.POST) {
                    return params;
                }
                return null;
            }
        };
        mRequestQueue.add(stringRequest);
    }

    /**
     * 發送一個字符串請求
     * @param url 圖片的連接
     * @param listener 成功獲取到Bitmap的監聽器
     * @param maxWidth 最大寬度,0則不限制
     * @param maxHeight 最大高度,0則不限制
     * @param scaleType ImageView的拉伸屬性
     * @param decodeConfig 圖片的格式
     * @param errorListener 失敗的監聽器
     */
    public void sendImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
                                 ImageView.ScaleType scaleType, Bitmap.Config decodeConfig, Response.ErrorListener errorListener){
        ImageRequest imageRequest = new ImageRequest(url, listener, maxWidth, maxHeight, scaleType, decodeConfig, errorListener);
        mRequestQueue.add(imageRequest);
    }
}

使用方法: 
經過單例的方法得到VolleyUtils的對象

private VolleyUtils mVolleyUtils;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //~~~
    mVolleyUtils = VolleyUtils.newInstance(this);
}

發出一個字符串的請求:

mVolleyUtils.sendStringRequest(Request.Method.GET, "https://www.baidu.com", null, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        tvShow.setText(response);
                    }
                }, null);

發出一個圖片的請求:

mVolleyUtils.sendImageRequest("https://www.baidu.com/img/bd_logo1.png", new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        iv_show.setImageBitmap(response);
                    }
                }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, null);

4.Volley缺點

  • 它只適用於頻繁而數據量小的請求。(當請求的是比較大的數據時,這個Volley框架發揮的做用就不是很大了。)
  • 它只實現了一級緩存(磁盤緩存)。(這樣作雖然節省內存資源的消耗,可是讀寫數據的速度會比較慢。咱們能夠在這個基礎上進行優化,多加一級內存緩存,實現多級緩存。讀者能夠自行對這個框架進行優化。對於緩存機制,我的以爲能夠學習下Universal image loader這個框架,裏面有幾種緩存機制寫得很好

好了,以上是對Volley框架的學習和理解。

參考連接:

https://blog.csdn.net/itachi85/article/details/51043704

https://www.cnblogs.com/caichongyang/articles/4399790.html

https://blog.csdn.net/ljx19900116/article/details/42272003

https://blog.csdn.net/qq_32001935/article/details/78224149

https://blog.csdn.net/qq_33425116/article/details/52685053

相關文章
相關標籤/搜索