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
- 創建一個RequestQueue對象。
- 創建一個ImageLoader對象。
- 獲取一個ImageListener對象。
- 調用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;
}
};