# 目錄
[TOC]
# 隊列的創建
```java
// 默認并發值為3
RequestQueue reqQueue = NoHttp.newRequestQueue();
// 或者傳入并發值
RequestQueue reqQueue = NoHttp.newRequestQueue(1);
```
> 并發的意思是,最多可以同時并行多少個請求。
1. 當一個頁面初始化時要請求多個接口,那么耗時相對會更長,對于用戶的體驗是很差的,所以如果能同時執行多個請求,那么將會縮短網絡請求的時間。
2. 假如我們傳入的并發值是3,但是我們同時添加了5個請求到隊列,第四個請求將會在前三個請求的任何一個完成后被發起,以此類推...
3. 假如我們想讓請求一個個執行,那么我們講隊列設置為1個并發,我們連續添加了10個請求到隊列,這個10個隊列將會按照添加順序依次執行。如果要設置請求優先級,請往下看。
4. 如果給`Request`設置了優先級,將優先執行優先級別較高的請求,關于優先級別[請看這里](http://doc.nohttp.net/222885)。
# 隊列的封裝
創建一個隊列應該多次使用,因為每創建一個隊列,就會創建指定`并發值`個線程,如果創建太多隊列就會耗資源,所以我們要把隊列封裝成單例模式。
## 隊列的單例模式封裝
```java
public class CallServer {
private static CallServer instance;
/**
* 請求隊列。
*/
private RequestQueue requestQueue;
private CallServer() {
requestQueue = NoHttp.newRequestQueue(3);
}
/**
* 請求隊列。
*/
public static CallServer getInstance() {
if (instance == null)
synchronized (CallServer.class) {
if (instance == null)
instance = new CallServer();
}
return instance;
}
/**
* 添加一個請求到請求隊列。
*
* @param what 用來標志請求, 當多個請求使用同一個Listener時, 在回調方法中會返回這個what。
* @param request 請求對象。
* @param listener 結果回調對象。
*/
public <T> void add(int what, Request<T> request, OnResponseListener listener) {
requestQueue.add(what, request, listener);
}
/**
* 取消這個sign標記的所有請求。
* @param sign 請求的取消標志。
*/
public void cancelBySign(Object sign) {
requestQueue.cancelBySign(sign);
}
/**
* 取消隊列中所有請求。
*/
public void cancelAll() {
requestQueue.cancelAll();
}
}
```
* 封裝如何使用
我們只需要在需要使用請求的地方這樣調用即可:
```java
Request request = ...
...
CallServer.getInstance().add(0, request, Listener);
```
## 在BaseActivity和BaseFragment中封裝
如果你看[這篇文章](http://doc.nohttp.net/222886),你會發現取消請求雖然可以與`Activity`、`Fragment`的生命周期綁定,但是每個Activity和Fragment都這么寫就顯得有點麻煩了,所以我們這里把這些操作寫在`BaseActivity`、`BaseFragment`中。
在Base中提供一個請求的方法,具體參數請結合自己的業務和習慣封裝。
```java
...
private Object cancelObject = new Object();
public <T> void request(int what, Request<T> request, OnResponseListener<T> listener) {
// 這里設置一個sign給這個請求。
request.setCancelSign(cancelObject);
CallServer.getInstance().add(what, request, listener);
}
@Override
protected void onDestroy() {
// 在組件銷毀的時候調用隊列的按照sign取消的方法即可取消。
CallServer.getInstance().cancelBySign(cancelObject);
super.onDestroy();
}
```
**推薦閱讀**
[1. NoHttp的隊列異步請求](http://doc.nohttp.net/222880)
[2. 取消請求、取消隊列中的請求](http://doc.nohttp.net/222886)
[3. Request優先級別](http://doc.nohttp.net/222885)