# 目錄
[TOC]
NoHttp的核心還是同步請求,本章要講的異步請求也是基于[同步請求](http://doc.nohttp.net/222861)的。
NoHttp的異步請求是在同步請求的基礎上用`任務隊列` + `Handler`實現的,如果你想更好的理解NoHttp,更好的使用隊列的特性,[強烈建議看這里](http://doc.nohttp.net/222881)。
# 異步請求的步驟
1、創建隊列([隊列特性講解點我](http://doc.nohttp.net/222881))
```java
RequestQueue queue = NoHttp.newRequestQueue();
```
2、創建請求
```java
Request<String> request = new StringRequest(url);
// 添加url?key=value形式的參數
request.add("enName", "yanzhenjie");
request.add("zhName", "嚴振杰");
request.add("website", "http://www.yanzhenjie.com");
```
3、添加請求到隊列
```java
...
queue.add(0, request, new OnResponseListener<String>(){
@Override
public void onSucceed(int what, Response<String> response) {
if(response.responseCode() == 200) {// 請求成功。
String result = response.get();
}
}
@Override
public void onFailed(int what, Response<String> response) {
Excepition exception = response.getException();
if(exception instanceof NetworkError) {// 網絡不好。
}
// 這里還有很多錯誤類型,可以看demo:
https://github.com/yanzhenjie/NoHttp
...
}
@Override
public void onStart(int what) {
// 這里可以show()一個wait dialog。
}
@Override
public void onFinish(int what) {
// 這里可以dismiss()上面show()的wait dialog。
}
});
```
這里對其中`queue.add(what, request, listener)`中的`what`做個說明,任意添加多個請求到隊列時,使用同一個Listener接受結果,listener的任何一個方法被回調時都會返回在添加請求到隊列時寫的相應what值,可以用這個what來區分是哪個請求的回調結果,你可以理解為它的作用和`handler`的`what`一樣的作用,就是用來區分信號來源的。
這樣做的好處是不像其它框架一樣,每個請求都`new listener()`來接受結果,這樣及省了代碼量,又讓代碼更加整潔。
當然如果你不想這么用,那么你可以每個請求都`new listener()`。
# 對于隊列使用的建議
創建一個隊列應該多次使用,因為每創建一個隊列,就會創建指定`并發值`個線程,如果創建太多隊列就會耗資源,所以我們要把隊列封裝成單例模式,強烈建議你請看這篇文檔:[隊列特性講解](http://doc.nohttp.net/222881)。
**推薦閱讀**
[隊列的詳解和封裝](http://doc.nohttp.net/222881)
[同步請求](http://doc.nohttp.net/222861)