volley建立請求佇列(Setting Up a RequestQueue)
編寫:kesenhoo - 原文:http://developer.android.com/training/volley/requestqueue.html
前一節課演示瞭如何使用Volley.newRequestQueue
這一簡便的方法來建立一個RequestQueue
,這是利用了Volley預設的優勢。這節課會介紹如何顯式的建立一個RequestQueue,以便滿足你自定義的需求。
這節課同樣會介紹一種推薦的實現方式:建立一個單例的RequestQueue,這使得RequestQueue能夠持續保持在你的app的生命週期中。
1)Set Up a Network and Cache
一個RequestQueue需要兩部分來支援它的工作:一部分是網路操作,用來傳輸請求,另外一個是用來處理快取操作的Cache。在Volley的工具箱中包含了標準的實現方式:DiskBasedCache
提供了每個檔案與對應響應資料一一對映的快取實現。 BasicNetwork
提供了一個網路傳輸的實現,連線方式可以是AndroidHttpClient 或者是 HttpURLConnection.
BasicNetwork
是Volley預設的網路操作實現方式。一個BasicNetwork必須使用HTTP Client進行初始化。這個Client通常是AndroidHttpClient 或者 HttpURLConnection:
- 對於app target API level低於API 9(Gingerbread)的使用AndroidHttpClient。在Gingerbread之前,HttpURLConnection是不可靠的。對於這個的細節,請參考Android's HTTP Clients。
- 對於API Level 9以及以上的,使用HttpURLConnection。
為了建立一個能夠執行在所有Android版本上的應用,你可以通過檢查系統版本選擇合適的HTTP Client。例如:
HttpStack stack;
...
// If the device is running a version >= Gingerbread...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
// ...use HttpURLConnection for stack.
} else {
// ...use AndroidHttpClient for stack.
}
Network network = new BasicNetwork(stack);
下面的程式碼片段演示瞭如何一步步建立一個RequestQueue:
RequestQueue mRequestQueue;
// Instantiate the cache
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap
// Set up the network to use HttpURLConnection as the HTTP client.
Network network = new BasicNetwork(new HurlStack());
// Instantiate the RequestQueue with the cache and network.
mRequestQueue = new RequestQueue(cache, network);
// Start the queue
mRequestQueue.start();
String url ="http://www.myurl.com";
// Formulate the request and handle the response.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// Do something with the response
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// Handle error
}
});
// Add the request to the RequestQueue.
mRequestQueue.add(stringRequest);
...
如果你僅僅是想做一個單次的請求並且不想要執行緒池一直保留,你可以通過使用在前面一課:傳送一個簡單的請求(Sending a Simple Request)文章中提到Volley.newRequestQueue()
方法在任何需要的時刻建立RequestQueue,然後在你的響應回撥裡面執行stop()
方法來停止操作。但是更通常的做法是建立一個RequestQueue並設定為一個單例。下面將演示這種做法。
2)Use a Singleton Pattern
如果你的程式需要持續的使用網路,更加高效的方式應該是建立一個RequestQueue的單例,這樣它能夠持續保持在整個app的生命週期中。你可以通過多種方式來實現這個單例。推薦的方式是實現一個單例類,裡面封裝了RequestQueue物件與其他Volley的方法。另外一個方法是繼承Application類,並在Application.OnCreate()
方法裡面建立RequestQueue。但是這個方法是不推薦的。因為一個static的單例能夠以一種更加模組化的方式提供同樣的功能。
一個關鍵的概念是RequestQueue必須和Application context所關聯的。而不是Activity的context。這確保了RequestQueue在你的app生命週期中一直存活,而不會因為activity的重新建立而重新建立RequestQueue。(例如,當使用者旋轉裝置時)。
下面是一個單例類,提供了RequestQueue與ImageLoader的功能:
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() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getImageLoader() {
return mImageLoader;
}
}
下面演示了利用單例類來執行RequestQueue的操作:
// Get a RequestQueue
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
getRequestQueue();
...
// Add a request (in this example, called stringRequest) to your RequestQueue.
MySingleton.getInstance(this).addToRequestQueue(stringRequest);
轉自:http://hukai.me/android-training-course-in-chinese/connectivity/volley/request-queue.html
相關文章
- ASIHttpRequest:建立佇列、下載請求、斷點續傳、解壓縮HTTP佇列斷點
- volley建立標準的網路請求(Making a Standard Request)
- Android網路請求(4) 網路請求框架VolleyAndroid框架
- Volley 原始碼解析之圖片請求原始碼
- Volley 原始碼解析之網路請求原始碼
- Android Volley 非同步網路請求分析Android非同步
- 使用 Promise 實現任務佇列傳送請求,實現最大請求數目限制Promise佇列
- 維護你的請求佇列,處理token異常佇列
- c# 透過訊息佇列處理高併發請求實列C#佇列
- Volley 網路請求框架介紹與使用說明框架
- 請教mina處理訊息?需要建立訊息佇列?佇列
- 封裝Volley使Volley的每個請求都自動儲存和傳送Cookie封裝Cookie
- 佇列的順序儲存--迴圈佇列的建立佇列
- Setting up Samba3.6.9 on Oracle Linux 6SambaOracleLinux
- [入門級]Setting up Python in Windows 7PythonWindows
- Not enough space to build proposed filesystem while setting up superblockUIWhileBloC
- LocustHttp 請求任務建立HTTP
- Volley傳送簡單的網路請求(Sending a Simple Request)
- Android Volley 原始碼解析(一),網路請求的執行流程Android原始碼
- Volley實現自定義的網路請求Implementing a Custom Request
- 建立訊息佇列(Kafka)源表佇列Kafka
- Setting up ASM on linux with LVM (Doc ID 292348.1)ASMLinuxLVM
- Setting up your App domain for SharePoint 2013APPAI
- oracle 10g advanced replication ---setting up deployment templateOracle 10g
- 佇列、阻塞佇列佇列
- android-Adding Search Functionality,Setting Up the Search InterfaceAndroidFunction
- 如何在Swift語言中建立http請求SwiftHTTP
- iOS 同步請求 非同步請求 GET請求 POST請求iOS非同步
- 佇列-單端佇列佇列
- setting up materialized view sites for oracle10g advanced replication mvZedViewOracle
- Nodejs Post請求報socket hang up錯誤的解決辦法NodeJS
- 佇列 和 迴圈佇列佇列
- 【佇列】【懶排序】佇列Q佇列排序
- 使用CocoaPods 時卡在這 Setting up CocoaPods master repo 不動AST
- 陣列模擬佇列 以及佇列的複用(環形佇列)陣列佇列
- 佇列 手算到機算 入門 佇列 迴圈佇列佇列
- 圖解--佇列、併發佇列圖解佇列
- 單調佇列雙端佇列佇列