Volley使用詳解

volley框架:
1、參考了已有框架的優點
2、開源

特點:
1.自動調度網絡請求,並在子線程中執行
2.多個併發的網絡連接
3.通過使用標準的HTTP緩存機制保持磁盤和內存響應的一致
4.支持請求優先級
5.支持取消請求的強大API,可以取消單個請求或多個

核心對象:
RequestQueue 用來執行請求的請求隊列
Request 用來構造一個請求對象
Request對象主要有以下幾種類型:

StringRequest 響應的主體爲字符串
JsonArrayRequest 發送和接收JSON數組
JsonObjectRequest 發送和接收JSON對象
ImageRequest 發送和接收Image

RequestQueue mQueue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest("http://route.showapi.com/6-1?showapi_appid=19987&showapi_sign=b9054b15df244f6a88588f33cd4372ea&num=15093238875\n",
                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);
            }
        });
        mQueue.add(stringRequest);

Volley的基本使用
1. 創建一個RequestQueue對象。
2. 創建一個StringRequest對象。
3. 將StringRequest對象添加到RequestQueue裏面。

//開發流程
RequestQueue mQueue = Volley.newRequestQueue(context); 

//是目標服務器的URL地址,第二個參數是服務器響應成功的回調,第三個參數是服務器響應失敗的回
調。
StringRequest stringRequest = new StringRequest(url,Listener,ErrorListener);
mQueue.add(stringRequest); 
    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);  
                                }  
                            });  
  ```

JsonObjectRequest、JsonArrayRequest、StringRequest的用法

//null:參數json格式
JsonObjectRequest stringRequest = new JsonObjectRequest(url,null,Listener,ErrorListener);

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,  
            new Response.Listener<JSONObject>() {  
                @Override  
                public void onResponse(JSONObject response) {  
                    Log.d("TAG", response.toString());  
                }  
            }, new Response.ErrorListener() {  
                @Override  
                public void onErrorResponse(VolleyError error) {  
                    Log.e("TAG", error.getMessage(), error);  
                }  
            });  

//長按事件
**.setOnLongClickListener(new View.OnLongClickLinstener(){
 public booblen onLongClick(View v){
        return flase;//flase表示不再向下傳遞,true表示從父標記向下傳遞此狀態,子標記共享此事件
        }
}

Post傳參:

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener); 
//POST是常量,此處的Method.POST表示用POST的方法傳參
重寫StringRequest類的getParams()方法。
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;  
    } 

post,get

get:效率高,2k,
post:可以提交大數據量,傳遞非英文字符,

圖片加載

使用ImageRequest下載圖片
ImageRequest imageRequest = new ImageRequest(url,Listener,0,0,Config.RGB_565,ErrorListener);


    ImageRequest imageRequest = new ImageRequest(  
            "http://developer.android.com/images/home/aw_dac.png",  
            new Response.Listener<Bitmap>() {  
                @Override  
                public void onResponse(Bitmap response) {  
                    imageView.setImageBitmap(response);  
                }  
            }, 0, 0, Config.RGB_565, new Response.ErrorListener() {  
                @Override  
                public void onErrorResponse(VolleyError error) {  
                    imageView.setImageResource(R.drawable.default_image);  
                }  
            }); 

ImageRequest的構造函數接收六個參數,第一個參數就是圖片的URL地址,這個沒什麼需要解釋的。第二個參數是圖片請求成功的回調,這裏我們把返回的Bitmap參數設置到ImageView中。第三第四個參數分別用於指定允許圖片最大的寬度和高度,如果指定的網絡圖片的寬度或高度大於這裏的最大值,則會對圖片進行壓縮,指定成0的話就表示不管圖片有多大,都不會進行壓縮。第五個參數用於指定圖片的顏色屬性,Bitmap.Config下的幾個常量都可以在這裏使用,其中ARGB_8888可以展示最好的顏色屬性,每個圖片像素佔據4個字節的大小,而RGB_565則表示每個圖片像素佔據2個字節大小。第六個參數是圖片請求失敗的回調,這裏我們當請求失敗時在ImageView中顯示一張默認圖片。

使用ImageLoader

  1. 創建一個RequestQueue對象。
  2. 創建一個ImageLoader對象。
  3. 獲取一個ImageListener對象。
  4. 調用ImageLoader的get()方法加載網絡上的圖片。
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {  
        @Override  
        public void putBitmap(String url, Bitmap bitmap) {  
        }  

        @Override  
        public Bitmap getBitmap(String url) {  
            return null;  
        }  
    });  
//一個參數指定用於顯示圖片的ImageView控件,第二個參數指定加載圖片的過程中顯示的圖片,第三個參數指定加載圖片失敗的情況下顯示的圖片。
    ImageListener listener = ImageLoader.getImageListener(imageView,  
            R.drawable.default_image, R.drawable.failed_image);  
    imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);  
//指定圖片允許的最大寬度和高度
    imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  
                    listener, 200, 200); 
//這裏我們將緩存圖片的大小設置爲10M。
    public class BitmapCache implements ImageCache {  

        private LruCache<String, Bitmap> mCache;  

        public BitmapCache() {  
            int maxSize = 10 * 1024 * 1024;  
            mCache = new LruCache<String, Bitmap>(maxSize) {  
                @Override  
                protected int sizeOf(String key, Bitmap bitmap) {  
                    return bitmap.getRowBytes() * bitmap.getHeight();  
                }  
            };  
        }  

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

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

使用NetworkImageV

ImageLoader loader=new ImageLoader(RequestQueue, ImageCache)

networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);  

    networkImageView.setDefaultImageResId(R.drawable.default_image);  
    networkImageView.setErrorImageResId(R.drawable.failed_image);  
    networkImageView.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",  
                    imageLoader);  

取消Request

  Activity裏面啓動了網絡請求,而在這個網絡請求還沒返回結果的時候,Activity被結束了,此時如果繼續使用其中的Context等,除了無辜的浪費CPU,電池,網絡等資源,有可能還會導致程序crash,所以,我們需要處理這種一場情況。使用Volley的話,我們可以在Activity停止的時候,同時取消所有或部分未完成的網絡請求。Volley裏所有的請求結果會返回給主進程,如果在主進程裏取消了某些請求,則這些請求將不會被返回給主線程。Volley支持多種request取消方式。一般寫在Activity的onStop方法中。

1)可以針對某些個request做取消操作:

 @Override
    public void onStop() {
        for (Request <?> req : mRequestQueue) {
            req.getTag().equals()
            req.cancel();
        }
    }

2)取消這個隊列裏的所有請求:
//可以在Activity中設置一個常量TAG,給每一個request.setTag,取消對應Tag讓請求就可以了

 @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        mRequestQueue.cancelAll(this);
    }

//可以通過setTag方法爲每一個Request添加tag
req.setTag(“Tag”);
//取消Request
reqQueue.cancelAll(“Tag”);

設置請求優先級

在實際開發中我們常常需要提高一些請求的優先級以便優先執行,可以通過覆寫getPrioriity()方法

//優先級有LOW,NORMAL,HIGH,IMMEDIATE
private Priority priority = Priority.HIGH;

StringRequest strReq = new StringRequest(Method.GET,
          Const.URL_STRING_REQ, 
          new Response.Listener<String>() {

     @Override
     public void onResponse(String response) {
             Log.d(TAG, response.toString());
             msgResponse.setText(response.toString());
             hideProgressDialog();
         }
     }, new Response.ErrorListener() {

      @Override
      public void onErrorResponse(VolleyError error) {
              VolleyLog.d(TAG, "Error: " + error.getMessage());
              hideProgressDialog();
      }
  }) {
     @Override
      public Priority getPriority() {
           return priority;
      }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章