一.Volley
Volley結合了AsyncHttpClient和Universal-Image-Loader的優點——簡化了http的使用 + 異步加載圖片的神奇能力。Android中的Http實現主要有HttpUrlConnection和HttpClient兩種,關於二者的選擇Google在Blog中表示推薦在薑餅小人(API
level = 9)及以上的版本中使用Java的HttpUrlConnection而在之前的版本使用Apache的HttpClient,這在Volley這個框架中也有明確的體現。
其執行步驟如下:
//初始化一個請求隊列
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
//根據給定的URL新建一個請求
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener() {
@Override
public void onResponse(String response) {
//在這裏操作UI組件是安全的,因爲響應返回時這個函數會被post到UI線程來執行
// 在這裏盡情蹂躪響應的String。
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// 出錯了怎麼辦?涼拌!並且在這裏拌。
}
});
// 把這個請求加入請求隊列
queue.add(stringRequest);
post請求:
//初始化一個請求隊列
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
//根據給定的URL新建一個請求
StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener() {
@Override
public void onResponse(String response) {
// 在這裏處理請求得到的String類型的響應
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// 在這裏進行出錯之後的處理
}
}) {
@Override
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
};
// 把這個請求加入請求隊列
queue.add(stringRequest);
取消請求:
Request中有一個cancel()方法,調用這個就可以取消當前請求了,但是取消到哪一個層次就不一定了,但是Volley可以保證響應處理函數(就是onResponse()和onErroeResponse())不會被調用。還有一個一起取消多個請求,就是在發出請求前調用Request的setTag()方法爲每個請求加一個標籤,這個方法的參數是Object,所以我們可以使用任何類型作爲標籤。這樣就可以調用ReqiestQueue的cancelAll()函數取消一羣標籤了。比較常用的方法就是,將發出這個請求的Activity或者Fragment作爲標籤,並在onStop()中調用cancelAll()。
優化RequestQueue
如果一個App需要頻繁的網絡通信的話,建立多個RequestQueue是件很奇怪的事兒(誰會因爲臨時有飛機要在海上起飛就去新建一艘航母呢,這得多有錢啊),所以Google推薦我們只實例化一個RequestQueue來應付頻繁的Http通信,當然,要保證隊列的壽命和App一樣長。如何實現呢?Google又說了,不推薦在App的Application.onCretae()方法中實例化一個RequestQueue(不過確實是個簡單的方法哈),最好是建立一個單例模式的類,並把所有我們需要用到的Volley的瓶瓶罐罐都放進去,這樣顯得更模塊化。下面就是示例代碼。這段代碼中最重要的就是RequestQueue要用Application的Context實例化,要不然就會隨着Activity的生命週期不停重建。
private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mCtx;
private MySingleton(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
mImageLoader = new ImageLoader(mRequestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static synchronized MySingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new MySingleton(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// getApplicationContext()是關鍵, 它會避免
// Activity或者BroadcastReceiver帶來的缺點.
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getImageLoader() {
return mImageLoader;
}
}
圖片請求:
ImageRequest能夠處理單張圖片,返回bitmap。
singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);
ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap arg0) {
// TODO Auto-generated method stub
singleImg.setImageBitmap(arg0);
}
}, 300, 200, Config.ARGB_8888, new ErrorListener(){
@Override
public void onErrorResponse(VolleyError arg0) {
// TODO Auto-generated method stub
}
});
mRequestQueue.add(imgRequest);
Volley提供了使用ImageLoader加載圖片的方法:
ImageLoader這個類需要一個Request的實例以及一個ImageCache的實例。不幸的是Volley沒有提供默認的實現。
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(
20);
ImageCache imageCache = new ImageCache() {
@Override
public void putBitmap(String key, Bitmap value) {
mImageCache.put(key, value);
}
@Override
public Bitmap getBitmap(String key) {
return mImageCache.get(key);
}
};
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);
// imageView是一個ImageView實例
// ImageLoader.getImageListener的第二個參數是默認的圖片resource id
// 第三個參數是請求失敗時候的資源id,可以指定爲0
ImageListener listener = ImageLoader
.getImageListener(imageView, android.R.drawable.ic_menu_rotate,
android.R.drawable.ic_delete);
mImageLoader.get(url, listener);
更多詳細的:
http://www.daxueit.com/article/4889-3.html
http://blog.csdn.net/xyz_lmn/article/details/12165391