安卓開發之Volley的基本使用

cxmscb發表於2016-07-25

一、Volley概述

  1. Volley 是Android上的一個網路通訊庫,能使網路通訊更簡單健壯。
  2. Volley 適合資料量不大但通訊比較頻繁的場景。

二、相關的API

  1. RequestQueue:請求佇列,會自動執行佇列中的請求

    • Volley.newRequestQueue(context):建立一個請求佇列

    • addRequest(Request request):將請求新增到佇列中處理

  2. Request:請求的介面

    • StringRequest:獲取字串資料的網路請求

    • JsonRequest:獲取JSON資料的網路請求

    • ImageRequest:獲取圖片結果的網路請求

三、使用Volley進行GET網路請求

一、StringRequest示例

    RequestQueue requestQueue ;

    private String path = "http://apis.baidu.com/apistore/idservice/id=11111";

    //獲取請求佇列例項
    requestQueue = Volley.newRequestQueue(this);

    StringRequest stringRequest = new StringRequest(Request.Method.POST, path, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //在主執行緒中進行返回資料處理
            Toast.makeText(MainActivity.this,response,Toast.LENGTH_SHORT).show();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //在主執行緒中執行TODO
            Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
        }
    });
    // 加入佇列
    requestQueue.add(stringRequest);

三、使用Volley進行POST網路請求

一、StringRequest示例

    RequestQueue requestQueue ;

    private String path = "http://apis.baidu.com/apistore/weatherservice/citylist";

   requestQueue = Volley.newRequestQueue(this);

   StringRequest stringRequest = new StringRequest(Request.Method.POST, path, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                //在主執行緒中執行
                Toast.makeText(MainActivity.this,response,Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //在主執行緒中執行TODO
                Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
            }
        }){

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                //設定提交請求的引數
                Map<String, String> params = new HashMap<String, String>();
                params.put("city","%E6%9C%9D%E9%98%B3");
                return params;
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                //設定提交請求的頭部資訊
                return super.getHeaders();
            }
        };
        // 加入佇列
        requestQueue.add(stringRequest);

二、JsonObjectRequest示例

  1. :JsonObjectRequest 不能重寫 getParams 來傳參

    RequestQueue requestQueue ;
    
    private String path = "http://apis.baidu.com/apistore/weatherservice/citylist";
    
    //獲取請求佇列例項
    requestQueue = Volley.newRequestQueue(this);
    
    //設定請求引數
    String params = "city=%E6%9C%9D%E9%98%B3";
    
    //在構造方法中傳參,不能通過getParams來傳參
    JsonObjectRequest jsonObjectRequest  = new JsonObjectRequest(Request.Method.POST, path, params, new Response.Listener<JSONObject>() {
    
        @Override
        public void onResponse(JSONObject response) {
            Toast.makeText(MainActivity.this,response.toString(),Toast.LENGTH_SHORT).show();
        }
    }, new Response.ErrorListener() {
    
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
        }
    });
    
    requestQueue.add(jsonObjectRequest);
    

四、使用Volley來載入圖片

一、使用ImageRequest獲取圖片bitmap

    RequestQueue requestQueue ;

    //獲取請求佇列例項
    requestQueue = Volley.newRequestQueue(this);

    //圖片地址
    String url = "http://avatar.csdn.net/6/9/1/1_cxmscb.jpg";


    /* 
    * ImageRequest的構造方法的引數說明:
    * 第一個引數:圖片url,第二個引數:響應監聽器
    * 第三個引數、第四個引數:分別用於指定允許圖片最大的寬度和高度.
    * 如果指定的網路圖片的寬度或高度大於這裡的最大值,則會對圖片進行壓縮.
    * 指定為0的話就表示不管圖片有多大,都不會進行壓縮。
    * 第五個引數:scaletype.圖片的填充方式
    * 第六個引數:指定圖片的顏色屬性.
    * ARGB_8888可展示最好的顏色屬性,每個圖片畫素佔據4個位元組的大小.
    * RGB_565則表示每個圖片畫素佔據2個位元組大小
    * 第七個引數:請求失敗後的回撥
    * 
    */

    ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap response) {
            Toast.makeText(MainActivity.this,"success",Toast.LENGTH_SHORT).show();
            ((ImageView)MainActivity.this.findViewById(R.id.imageView)).setImageBitmap(response);
        }
    }, 200, 200, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
        }
    });

    requestQueue.add(imageRequest);

二、使用ImageLoader載入圖片

  1. ImageLoader的內部是使用ImageRequest來實現的,不過ImageLoader要比ImageRequest更加高效,它不僅可以對圖片快取ImageCache,還可以過濾掉重複的連結,避免重複傳送請求。

    RequestQueue requestQueue ;
    
    //獲取請求佇列例項
    requestQueue = Volley.newRequestQueue(this);
    
    ImageView imageView = (ImageView) findViewById(R.id.imageView);
    
    String url = "http://avatar.csdn.net/6/9/1/1_cxmscb.jpg";
    
    /* 第一個引數:RequestQueue物件。
     * 第二個引數是一個ImageCache物件。
     * BitmapCache為ImageCache子類,起到圖片快取的作用
     */
    
    ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());
    
    /* 第一個引數:顯示圖片的ImageView控制元件.
     * 第二個引數:載入圖片時顯示的圖片.
     */ 第三個引數:載入圖片失敗時顯示的圖片。
    
    ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageView,R.drawable.default_img,R.drawable.error_img);
    
    //第三個引數、第四個引數:分別用於指定允許圖片最大的寬度和高度.
    
    imageLoader.get(url,imageListener,200,200);
    

public class BitmapCache implements ImageLoader.ImageCache {

    private LruCache<String, Bitmap> mCache;


    public BitmapCache() {

        int maxSize = 10 * 1024 * 1024;
        //將快取圖片的總大小設定為10M
        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);
    }

}

三、使用NetworkImageView來載入圖片

  1. NetworkImageView是一個自定義控制元件,繼承自ImageView,在ImageVie的基礎之上加入了載入網路圖片的功能。

    <com.android.volley.toolbox.NetworkImageView
        android:layout_width="220dp"
        android:layout_height="220dp"
        android:id="@+id/imageView"
        android:scaleType="centerInside" />
    
  2. NetworkImageView在載入圖片時,會自動獲取自身的寬高,然後與網路圖片的寬高對比,再決定是否需要對圖片進行壓縮。
    當不想對圖片進行壓縮,可在佈局檔案中把NetworkImageView的屬性layout_width和layout_height設定成wrap_content.

    NetworkImageView networkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
    
    networkImageView.setDefaultImageResId(R.drawable.default_img);
    networkImageView.setErrorImageResId(R.drawable.error_img);
    
    String url = "http://avatar.csdn.net/6/9/1/1_cxmscb.jpg";
    
    ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());
    
    
    networkImageView.setImageUrl(url,imageLoader);
    
  3. NetworkImageView控制元件的用法要比前兩種方式更加簡單,不需要再建立一個ImageListener。

五、request請求的取消

如果在Activity裡啟動了volley網路請求,那麼在Activity銷燬之前應將還沒完成的請求/未啟動的請求進行取消以釋放記憶體資源。

public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue mRequestQueue;  // Assume this exists.

//給請求設定標記   
stringRequest.setTag(TAG);

...
... 

@Override
protected void onStop () {
    super.onStop();
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(TAG);
    }
}

相關文章