# 目录
[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)