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