谷歌官方推出的Volley架構,實作了小資料、多頻發,以及圖檔加載的網絡操作。這友善了大家開發,但是沒有對擷取Cookie做相應的處理,使用者想要擷取的話,很麻煩,這也造成了代碼冗雜,是以為了友善大家,我就對Volley架構進行了二次封裝,當然也借鑒了網上的經驗(嘿嘿)。封裝實作了Get和Post帶Cookie的網絡請求,以及圖檔加載和圖檔緩存。
這是我的項目工程:
首先你要導入Volley.jar庫
一、先來介紹網絡請求部分,這部分實作了:
1、不帶Cookie的Get方式請求網絡資料
2、帶Cookie的Get方式請求網絡資料
3、不擷取Cookie也不帶Cookie但是帶參數的Post網絡請求
4、不擷取Cookie也不帶Cookie和參數的Post網絡請求
5、帶參數的擷取Cookie的Post網絡請求
6、帶Cookie而且有參數的Post網絡請求
7、帶Cookie但是沒有參數的Post網絡請求
VolleyHelper 類
public class VolleyHelper {
public static final int MEMORY_CACHE = ;//緩存在記憶體中
public static final int DISK_CACHE = ;//緩存在sd卡中
public static final int DOUBLE_CACHE = ;//記憶體和sd雙緩存
public static void getRequest(RequestQueue requestQueue,String requestTag,String url,VolleyRequest volleyRequest){//不帶Cookie的Get方式請求網絡資料
removeRequest(requestQueue,requestTag);
StringRequest request = new StringRequest(Request.Method.GET,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener());
request.setTag(requestTag);
requestQueue.add(request);
}
public static void getRequestWithCookie(RequestQueue requestQueue,String requestTag,String url,final String cookie,VolleyRequest volleyRequest){//帶Cookie的Get方式請求網絡資料
removeRequest(requestQueue,requestTag);
StringRequest request = new StringRequest(Request.Method.GET,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap localHashMap = new HashMap();
localHashMap.put("Cookie", cookie);
return localHashMap;
}
};
request.setTag(requestTag);
requestQueue.add(request);
}
public static void postRequest(RequestQueue requestQueue,String requestTag,String url,final Map<String, String> params,VolleyRequest volleyRequest){//不擷取Cookie也不帶Cookie但是帶參數的Post網絡請求
removeRequest(requestQueue,requestTag);
StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
request.setTag(requestTag);
requestQueue.add(request);
}
public static void postRequest(RequestQueue requestQueue,String requestTag,String url,VolleyRequest volleyRequest){//不擷取Cookie也不帶Cookie和參數的Post網絡請求
removeRequest(requestQueue,requestTag);
StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener());
request.setTag(requestTag);
requestQueue.add(request);
}
public static void postRequestGetCookie(RequestQueue requestQueue,String requestTag,String url,final Map<String, String> params,VolleyRequest volleyRequest,final CookieInterface cookieInterface){//帶參數的擷取Cookie的Post網絡請求
removeRequest(requestQueue,requestTag);
StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
Map<String, String> responseHeaders = response.headers;
String cookies = responseHeaders.get("Set-Cookie");
cookieInterface.onResposeCookie(cookies);//設定回調,這裡面不能更新UI
return super.parseNetworkResponse(response);
}
};
request.setTag(requestTag);
requestQueue.add(request);
}
public static void postRequestWithCookie(RequestQueue requestQueue,String requestTag,String url,final Map<String, String> params,final String cookie,VolleyRequest volleyRequest){//帶Cookie而且有參數的Post網絡請求
removeRequest(requestQueue,requestTag);
StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap localHashMap = new HashMap();
localHashMap.put("Cookie", cookie);
return localHashMap;
}
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
request.setTag(requestTag);
requestQueue.add(request);
}
public static void postRequestWithCookie(RequestQueue requestQueue,String requestTag,String url,final String cookie,VolleyRequest volleyRequest){//帶Cookie但是沒有參數的Post網絡請求
removeRequest(requestQueue,requestTag);
StringRequest request = new StringRequest(Request.Method.POST,url,volleyRequest.getVolleyListener(),volleyRequest.getVolleyErrorListener()){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap localHashMap = new HashMap();
localHashMap.put("Cookie", cookie);
return localHashMap;
}
};
request.setTag(requestTag);
requestQueue.add(request);
}
public static void removeRequest(RequestQueue requestQueue,String requestTag){//移除多餘的請求
requestQueue.cancelAll(requestTag);
}
public static void displayImage(RequestQueue requestQueue,String imageTag,String url, final ImageView imageView,int defaultImageResId, final int errorImageResId,int imageViewWidth,int imageViewHeiget,Bitmap.Config decodeConfig){//沒有緩存的圖檔加載模式
removeRequest(requestQueue, imageTag);
//顯示加載中的圖檔
imageView.setImageResource(defaultImageResId);
ImageRequest request = new ImageRequest(
url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
//設定加載成功的圖檔
imageView.setImageBitmap(bitmap);
}
},
imageViewWidth, imageViewHeiget, decodeConfig,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//設定加載失敗的圖檔
imageView.setImageResource(errorImageResId);
}
});
request.setTag(imageTag);
requestQueue.add(request);
}
public static void displayImageWithCache(RequestQueue requestQueue,String url,ImageView imageView,int defaultImageResId,int errorImageResId,int cacheMode){//可以設定緩存的圖檔加載方式
ImageLoader imageLoader;
switch (cacheMode){
case MEMORY_CACHE:
imageLoader = new ImageLoader(requestQueue, new MemoryCache());
break;
case DISK_CACHE:
imageLoader = new ImageLoader(requestQueue, new DiskCache());
break;
case DOUBLE_CACHE:
imageLoader = new ImageLoader(requestQueue, new DoubleCache());
break;
default:
imageLoader = new ImageLoader(requestQueue, new MemoryCache());
break;
}
ImageLoader.ImageListener listener = imageLoader.getImageListener(imageView,defaultImageResId,errorImageResId);
//加載及緩存網絡圖檔
imageLoader.get(url,listener);
}
}
擷取Cookie我用是接口進行回調,
CookieInterface類
public interface CookieInterface {
void onResposeCookie(String cookie);
}
PS:這裡要注意,回調實在網絡請求的子線程中進行的,是以不能在回調中進行UI更新。
二、圖檔加載子產品:
這部分分為兩種加載方式:
1、沒有緩存的圖檔加載模式:
/*requestQueue:請求隊列
imageTag:請求标記
url:請求位址
imageView:顯示對象
defaultImageResId:加載時預設顯示的圖檔id
errorImageResId:加載失敗時顯示的圖檔id
imageViewWidth:圖檔壓縮寬度
imageViewHeiget:圖檔壓縮高度
decodeConfig:圖檔存儲模式(有以下四種模式)
Bitmap.Config ARGB_4444:每個像素占四位,即A=4,R=4,G=4,B=4,那麼一個像素點占4+4+4+4=16位
Bitmap.Config ARGB_8888:每個像素占四位,即A=8,R=8,G=8,B=8,那麼一個像素點占8+8+8+8=32位
Bitmap.Config RGB_565:每個像素占四位,即R=5,G=6,B=5,沒有透明度,那麼一個像素點占5+6+5=16位
Bitmap.Config ALPHA_8:每個像素占四位,隻有透明度,沒有顔色。*/
public static void displayImage(RequestQueue requestQueue,String imageTag,String url, final ImageView imageView,int defaultImageResId, final int errorImageResId,int imageViewWidth,int imageViewHeiget,Bitmap.Config decodeConfig){//沒有緩存的圖檔加載模式
removeRequest(requestQueue, imageTag);
//顯示加載中的圖檔
imageView.setImageResource(defaultImageResId);
ImageRequest request = new ImageRequest(
url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
//設定加載成功的圖檔
imageView.setImageBitmap(bitmap);
}
},
imageViewWidth, imageViewHeiget, decodeConfig,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//設定加載失敗的圖檔
imageView.setImageResource(errorImageResId);
}
});
request.setTag(imageTag);
requestQueue.add(request);
}
2、設定可緩存的圖檔加載方式:
/*requestQueue:請求隊列
url:請求位址
imageView:顯示對象
defaultImageResId:加載時預設顯示的圖檔id
errorImageResId:加載失敗時顯示的圖檔id
cacheMode:緩存模式(記憶體緩存,SD緩存,記憶體SD雙緩存)*/
public static void displayImageWithCache(RequestQueue requestQueue,String url,ImageView imageView,int defaultImageResId,int errorImageResId,int cacheMode){//可以設定緩存的圖檔加載方式
ImageLoader imageLoader;
switch (cacheMode){
case MEMORY_CACHE:
imageLoader = new ImageLoader(requestQueue, new MemoryCache());
break;
case DISK_CACHE:
imageLoader = new ImageLoader(requestQueue, new DiskCache());
break;
case DOUBLE_CACHE:
imageLoader = new ImageLoader(requestQueue, new DoubleCache());
break;
default:
imageLoader = new ImageLoader(requestQueue, new MemoryCache());
break;
}
ImageLoader.ImageListener listener = imageLoader.getImageListener(imageView,defaultImageResId,errorImageResId);
//加載及緩存網絡圖檔
imageLoader.get(url,listener);
}
源碼下載下傳