1 簡介
我們平時開發Android程試中少不了網絡請求,而Android本身也提供了HttpURLConnection和HttpClient來進行網絡請求通信。可是HttpURLConnection和HttpClient使用起來難免會有些複雜。在2013年Google I/O大會上推出了Volley網絡通信框架。Volley的特點是使用簡單而且適合數據量不大,通信頻繁併發量大的網絡請求操作。
2 下載
Volly的官網地址是:https://developer.android.com/training/volley/index.html,源碼於:https://github.com/google/volley中。下載源碼後,我們可以將其編譯成jar包或aar文件。使用Android Studio打開該項目並在菜單欄中直接點擊“Build”-“Make Project”可直接在\ build\outputs\aar\生成aar文件。aar文件裏並沒有資源,只有一個classes.jar和兩個AndroidManifest.xml。所以您可以選擇直接從您自己工程項目中導入aar文件或提取jar文件導入來使用。
如果你不想下載源碼和編譯,可以直接在Gradle中進行依賴就行:
dependencies {
...
compile 'com.android.volley:volley:1.1.1'
}
3 使用
Volley的使用是非常的簡單,實際上就是四個步聚:
1、在AndroidManifest.xml中添加訪問網絡權限<uses-permissionandroid:name="android.permission.INTERNET" />
2、創建請求隊列RequestQueue對象
3、創建請求Request對象
4、將Request對象add到RequestQueue對象中
注意:
我們前面介紹Volley時提到,Volley是適合於高併發量的網絡請求操作,所以我們不必創建多個RequestQueue對象去請求網絡操作,因爲這樣是非常浪費資源的。一般地我們使用單例在整個項目中使用一個RequestQueue即可。
3.1 StringRequest的使用
StringRequest繼承於Request,剛剛我們提到的四個步聚中的第3步創建Request對象,現在就使用StringRequest來實現一個網址的請求,然後返回訪問結果:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest = new StringRequest(Request.Method.GET, "http://www.xxx.com",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
// 請求成功
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
// 請求失敗
}
});
requestQueue.add(stringRequest);
示例中首先通過Volley.newRequestQueue方法創建了一個RequestQueue對象;接着要創建一個請求對象StringRequest的對象,StringRequest類構造函數接收四個參數,分別是請求類型(GET或POST)、請求URL、請求成功回調和請求失敗回調;最後,將這個StringRequest對象添加到RequestQueue隊列就可以大功告成了。
不知讀者們有沒有發現,StringRequest類有個很大的缺陷,就是不支持傳入參數,但我們知道StringRequest是繼承於Request,而從源碼中可以看到Request類中有一個方法getParams,此方法返回值便是最終請求所求的參數。所以我們將上面的代碼稍微修改一下:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest = new StringRequest(Request.Method.GET, "http://www.xxx.com",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
// 請求成功
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
// 請求失敗
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap();
map.put("params1", "value1");
map.put("params2", "value2");
// ...
return map;
}
};
requestQueue.add(stringRequest);
就這樣就可以完美經支持帶參數的網絡請求,因爲我們一般在POST請求中都會帶上參數,若不支持的話,那就真得是很廢物了。
3.2 JsonRequest的使用
JsonRequest也是繼承於Request,JsonRequest的使用跟StringRequest的使用大同小異,只是在回調的類型中是一個Json對象,而不是String字符串。JsonRequest本身是一個抽象類,它的實現由JsonObjectRequest和JsonArrayRequest來完成,從名字上應該可以猜到,它們的請求,一個是返回接收Json數據,而一個是返回接收Json數組罷了。我們來看看它們的實現:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
// 帶參數的JsonObjectRequest請求
Map<String, String> params = new HashMap();
params.put("params1", "value1");
params.put("params2", "value2");
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, "http://www.xxx.com", new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// 請求成功
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// 請求失敗
}
});
requestQueue.add(jsonObjectRequest);
// 不帶參數的JsonArrayRequest請求
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, "http://www.xxx.com", null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
// 請求成功
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
// 請求失敗
}
});
requestQueue.add(jsonArrayRequest);
3.3 ImageRequest的使用
相同的道理,ImageRequest同樣也繼承於Request,我們直接來看看它的使用示例:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
ImageRequest imageRequest = new ImageRequest(
"http://xxx.png", // 請求圖片地址
new Response.Listener<Bitmap>() { // 請求成功回調
@Override
public void onResponse(Bitmap bitmap) {
//imageView.setImageBitmap(bitmap);
}
},
0, // 圖片最大寬度,如果比原圖小,則會進行壓縮處理,0表示獲取原圖大小不會進行壓縮
0, // 圖片最大高度,如果比原圖小,則會進行壓縮處理,0表示獲取原圖大小不會進行壓縮
ImageView.ScaleType.CENTER_INSIDE, // 指定圖片進行壓縮的縮放類型,默認CENTER_INSIDE,表示保持寬高比例縮小圖片
Bitmap.Config.ARGB_8888, // 指定圖片的顏色屬性,ARGB_8888可以展示最好的顏色屬性,每個圖片像素佔據4個字節的大小,而RGB_565則表示每個圖片像素佔據2個字節大小
new Response.ErrorListener() { // 請求失敗回調
@Override
public void onErrorResponse(VolleyError error) {
//imageView.setImageResource(R.drawable.default_image);
}
});
requestQueue.add(imageRequest);
可以看到ImageRequest的參數跟之前StringRequest和JsonRequest有些不一樣。參數說明請看上面代碼中的註釋。
3.4 ImageLoader的使用
ImageLoader並非像前面幾個XXXRequest一樣繼承Request類,它的內部使用了ImageRequest來實現,可以說是在ImageRequest基礎上的一個升級,它可以對網絡請求的圖片進行緩存從而可以避免了一些重複的網絡請求,所以它的效率比ImageRequest更加高。下面我們來看看示例:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.failed_image);
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
// TODO 在這裏要將bitmap添加入緩存
}
@Override
public Bitmap getBitmap(String url) {
// TODO 在這裏要做返回緩存中的圖片
return null;
}
});
imageLoader.get("http://xxx.png", listener, 100, 100);
說明:
1、第一步,還是定義一個RequestQueue對象;
2、創建一個ImageListener對象,創建方法接收三個參數,第一個參數指定用於顯示圖片的ImageView控件,第二個參數指定加載圖片的過程中顯示的圖片,第三個參數指定加載圖片失敗的情況下顯示的圖片;
3、創建ImageLoader對象,它的構造函數接收兩個參數,第一個參數是RequestQueue對象對象,而第二個參數是一個ImageCache類對象,ImageCache類下要實現兩個方法,它們是putBitmap和getBitmap。我們前面所說的緩存便是在這裏來實現,putBitmap方法中要將請求接收到的bitmap對象添加到緩存中支,而getBitmap方法則通過請求的url來獲取在putBitmap方法中添加入緩存的圖片。緩存的實現,可以利用LruCache,LruCache是一個泛型類,它是Android3.1讓提供的一個緩存類,它內部採用一個LinkedHashMap以強引用的方式存儲外界的緩存對象,其提供了get和put方法來完成緩存的獲取和添加操作。如果要做到磁盤緩存,還可以使用DiskLruCache,它不屬於AndroidSDK一部分,使用DiskLruCache要提前動手下載好,這裏就不詳情介紹緩存的使用,因爲我們今天重點是講volley的使用。
4、最後,調用ImageLoader的get()方法來加載圖片。get方法最後兩個參數是設定圖片的最大長和寬,默認0表示不壓縮,按原圖大小。