原文鏈接:Setting Up a RequestQueue
這節(jié)課教你:
- 建立一個Network和Cache
- 使用單例模式
先前的教程教你如何使用Volley.newRequestQueue
這個便捷的方法類建立一個RequestQueue
彭谁,使用Volley的默認(rèn)行為(譯注:默認(rèn)值)闺魏。這節(jié)課帶你通過明確的步驟來創(chuàng)建一個RequestQueue
史辙,你可以使用自定義的行為(譯注:自定義值)。
這節(jié)課還要闡述創(chuàng)建一個RequestQueue
的推薦實踐误证,就是單例漂彤,它使得RequestQueue
與app的生命周期相伴弦牡。
建立一個Network和Cache
RequestQueue
需要兩個東西才能工作:一個是network來完成request的傳輸兼都,另一個是cache來處理緩存。在Volley的工具箱中對這些有標(biāo)準(zhǔn)的實現(xiàn):DiskBasedCache
提供了每個響應(yīng)一個文件的緩存套媚,使用內(nèi)存中索引缚态,BasicNetwork
提供了一個基于你優(yōu)選的HTTP客戶端的網(wǎng)絡(luò)傳輸。
BasicNetwork
是Volley的默認(rèn)網(wǎng)絡(luò)實現(xiàn)堤瘤。BasicNetwork
必須被你的app連接網(wǎng)絡(luò)所使用的HTTP客戶端初始化玫芦。典型情況是HttpURLConnection
下面的代碼片段展示了建立一個RequestQueue
需要的步驟:
// 使用 cache 和 network初始化 RequestQueue
mRequestQueue = new RequestQueue(cache, network);
// 啟動隊列
mRequestQueue.start();
String url ="http://www.example.com";
// 明確描述請求(request)并處理響應(yīng)(response)
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// 處理響應(yīng)信息
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Handle error
}
});
// 添加request 到 RequestQueue.
mRequestQueue.add(stringRequest);
// ...
如果你只是產(chǎn)生一次性的request而不想留下線程池,你可以使用Sending a Simple Request中描述的Volley.newRequestQueue()
在任何你需要的地方創(chuàng)建RequestQueue
本辐,然后一旦響應(yīng)或錯誤返回了桥帆,在RequestQueue
調(diào)用stop()
。但是更普遍的用法是使用單例創(chuàng)建RequestQueue
师郑,讓RequestQueue
伴隨著app的生命周期一直運(yùn)行环葵,這個在下一個部分討論。
使用單例模式
如果你的應(yīng)用需要經(jīng)常使用網(wǎng)絡(luò)宝冕,那么創(chuàng)建單例的RequestQueue
會更高效张遭。你可以通過多種方式實現(xiàn)。推薦的方式是實現(xiàn)一個單例類來封裝RequestQueue
和其它的Volley有的功能地梨。另一種方式是繼承Application
并在Application.onCreate()
方法中構(gòu)建RequestQueue
菊卷。但是我們不鼓勵這樣做。一個靜態(tài)的單例能夠更加模塊化地提供相同的功能宝剖。
關(guān)鍵的是RequestQueue
必須用Application
的context來初始化洁闰,而不是Activity
的context。這樣才能保證RequestQueue
能夠伴隨著應(yīng)用的生命周期存在万细,而不是隨著activity的每次重建而重建(比如扑眉,當(dāng)用戶旋轉(zhuǎn)設(shè)備)。
下面是一個單例類的例子赖钞,提供了RequestQueue
和ImageLoader
的功能:
public class MySingleton {
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() 是關(guān)鍵, 它避免了你
//傳遞進(jìn)Activity或BroadcastReceiver導(dǎo)致的內(nèi)存泄漏
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getImageLoader() {
return mImageLoader;
}
}
下面是使用單例類來執(zhí)行RequestQueue
操作的例子:
// 獲取一個RequestQueue
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
getRequestQueue();
// ...
// 添加一個request (示例中為 stringRequest) 到RequestQueue中
MySingleton.getInstance(this).addToRequestQueue(stringRequest);
項目源碼下載 :點擊下載
系列索引
- 【譯】Volley官方文檔五:實現(xiàn)一個自定義的Request
- 【譯】Volley官方文檔四:構(gòu)建一個標(biāo)準(zhǔn)的Request
- 【譯】Volley官方文檔三:建立一個RequestQueue
- 【譯】Volley官方文檔二:發(fā)送一個簡單的request
- 【譯】Volley官方文檔一:使用Volley傳遞網(wǎng)絡(luò)數(shù)據(jù)
更新日志 ↓ ↓ ↓
- 2016年03月21日:添加了系列索引
- 2016年03月20日
- 翻譯了代碼中的英文
- 添加了源碼