Android连接服务器请求架包之 Async-http-client
2015-11-26 11:53
656 查看
Async-http-client第三方开源类库,主要针对Android开发中发送http请求的。从名字Async中就知道它是异步操作,在非UI线程中执行,请求时不需要其他处理,用起来十分方便。
需要这两个.jar包。android-async-http-1.4.9.jar 和 httpclient-4.4.1.1.jar SDK6.0之后只需要前面那个架包。
官方下载地址:http://loopj.com/android-async-http/
对应的github地址:https://github.com/loopj/android-async-http
也可以到我的博客资源库去下载:http://download.csdn.net/detail/tom_xiaoxie/9301799
我这里简要介绍下:它是专门针对Android在Apache的HttpClient基础上构建的异步的callback-based http client。所有的请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在Service中或者后台线程中,库代码会自动识别出它所运行的context。它的feature包括:
1. 发送异步http请求,在匿名callback对象中处理response;
2. http请求发生在UI线程之外;
3. 内部采用线程池来处理并发请求;
4. GET/POST 参数构造,通过RequestParams类。
5. 内置多部分文件上传,不需要第三方库支持;
6. 流式Json上传,不需要额外的库;
7. 能处理环行和相对重定向;
8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
9. 自动智能的请求重试机制在各种各样的移动连接环境中;
10. 自动的gzip响应解码;
11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
13. 通过BaseJsonHttpResponseHandler和各种json库集成;
14. 支持SAX解析器;
15. 支持各种语言和content编码,不仅仅是UTF-8。
大概翻译了下,这些只是大体的概览,具体的细节还得在使用过程中慢慢感受、学习。接下来,带领大家看看应用android-async-http来写代码是个啥样子。简单来说你只需要3步,
1. 创建一个AsyncHttpClient;
2. (可选的)通过RequestParams对象设置请求参数;
3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了 AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
接下来看看代码如何写:
上面这个是没有传参数的请求,若是要传参数,也非常的容易,你只需要通过RequestParams来传递各种参数就可以了。
上面的例子返回的response直接是原生字节流的形式,如果你需要把返回的结果当成一个String对待的话,之间转换时一种方式。这么强大的工具怎么会没有想到我们的需求呢?只需改变你的回调对象即可,TextHttoResponseHandler,其是继承自AsyncHttpResponse,它将原生的字节流根据指定的encoding转化成了String对象了。
需要这两个.jar包。android-async-http-1.4.9.jar 和 httpclient-4.4.1.1.jar SDK6.0之后只需要前面那个架包。
官方下载地址:http://loopj.com/android-async-http/
对应的github地址:https://github.com/loopj/android-async-http
也可以到我的博客资源库去下载:http://download.csdn.net/detail/tom_xiaoxie/9301799
我这里简要介绍下:它是专门针对Android在Apache的HttpClient基础上构建的异步的callback-based http client。所有的请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在Service中或者后台线程中,库代码会自动识别出它所运行的context。它的feature包括:
1. 发送异步http请求,在匿名callback对象中处理response;
2. http请求发生在UI线程之外;
3. 内部采用线程池来处理并发请求;
4. GET/POST 参数构造,通过RequestParams类。
5. 内置多部分文件上传,不需要第三方库支持;
6. 流式Json上传,不需要额外的库;
7. 能处理环行和相对重定向;
8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
9. 自动智能的请求重试机制在各种各样的移动连接环境中;
10. 自动的gzip响应解码;
11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
13. 通过BaseJsonHttpResponseHandler和各种json库集成;
14. 支持SAX解析器;
15. 支持各种语言和content编码,不仅仅是UTF-8。
大概翻译了下,这些只是大体的概览,具体的细节还得在使用过程中慢慢感受、学习。接下来,带领大家看看应用android-async-http来写代码是个啥样子。简单来说你只需要3步,
1. 创建一个AsyncHttpClient;
2. (可选的)通过RequestParams对象设置请求参数;
3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了 AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
接下来看看代码如何写:
<span style="white-space:pre"> </span>AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onStart() { // called before request is started } @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { // called when response HTTP status is "200 OK" } @Override public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { // called when response HTTP status is "4XX" (eg. 401, 403, 404) } @Override public void onRetry(int retryNo) { // called when request is retried } });
上面这个是没有传参数的请求,若是要传参数,也非常的容易,你只需要通过RequestParams来传递各种参数就可以了。
AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.put("key", "value"); params.put("more", "data"); client.get("http://www.google.com", params, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { System.out.println(response); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { Log.d("ERROR", error); } });
上面的例子返回的response直接是原生字节流的形式,如果你需要把返回的结果当成一个String对待的话,之间转换时一种方式。这么强大的工具怎么会没有想到我们的需求呢?只需改变你的回调对象即可,TextHttoResponseHandler,其是继承自AsyncHttpResponse,它将原生的字节流根据指定的encoding转化成了String对象了。
AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.put("key", "value"); params.put("more", "data"); client.get("http://www.google.com", params, new TextHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, String response) { System.out.println(response); } @Override public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) { Log.d("ERROR", error); } } );同样的方式,你也可以发送JSON请求。JsonHttpResponseHandler匿名类。返回的Response直接以JSONObject的形式返回,也支持JSONArray的形式,你只需要Override你需要的版本就可以
String url = "http://192.168.1.112:8080/app/page?PageNo="+pageNo+"&PageSize=20"; AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.put("q", "android"); params.put("rsz", "8"); client.get(url, params, new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { // Handle resulting parsed JSON response here } @Override public void onSuccess(int statusCode, Header[] headers, JSONArray response) { // Handle resulting parsed JSON response here } });
相关文章推荐
- 《读书笔记》系列2:TCP/IP详解
- Http通讯
- HttpClient调用第三方接口 底层代码的封装 方便以后使用
- ios 机型检测和网络检测
- 网络舆情分析技术 读书笔记2
- kali攻防第4章 内网称霸之HTTP信息截取
- C# 之httpwatch 缩减HttpWatch成可以进行二次开发的代码
- java基础之网络(UDP-Socket)
- 我的HttpClients工具
- Xcode7 HTTP无法获取数据的解决办法(不能用HTTP要用HTTPS的解决办法)
- HTTPClient
- 网络验证码--你到底是爱它还是恨它?
- (jsp/html)网页上嵌入播放器(常用播放器代码整理) http://www.jb51.net/article/37267.htm
- TCP拥塞控制
- 解决Xcode 不能 访问http的问题
- Windows, 使用https访问网页提示此网站的安全证书有问题解决方法
- Android 下载网络url文件并显示进度
- firefox omFileUpload flash http error 302
- Win2003打不开https的问题
- TCP/IP协议学习(三) 链路层详解