前一阵子刚搬了家,加上公司要发新版本,因此一直比较忙,文章也好几周没更新了。可贵这个周末有空,正好周内偶然间闲逛android
发现这个很不错的第三方开源类库,针对Android开发中发送http请求的。git
在Android开发中,发送、处理http请求简直太常见了,以致于咱们的代码里处处充斥着各类HttpClient和与之相关又臭又长的代码,github
它们存在于你代码的各个角落,每次看见都使人做呕,而你仅仅是为了server能返回一个string或者json给你。每次当我本身写这样ajax
的代码时,我都会想能不能简化下这个流程,可能二、3行代码就能搞定。由于针对最简单的case,我只须要提供request url,成功时的apache
callback和(或)失败时的callback,仅此而已。针对这一类问题(需求),能够说android-async-http提供了几乎完美的解决方案。json
经过使用它能够大大简化你的代码,不只如此,你的代码看上去也优雅多了。api
当我第一眼看到它时就被吸引住了,特别是async关键字,干咱们这行的都知道,这是异步执行,也就是说它的网络请求自动在非UIcookie
线程里执行,你不须要任何额外的操做(好比手动new一个Thread之类)。项目的官方网站:网络
http://loopj.com/android-async-http/,对应的github地址:https://github.com/loopj/android-async-http并发
我这里简要介绍下:它是专门针对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,你通常不须要本身建立一个。
来看看代码如何写:
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 } });
是否是很简洁,有没有被震撼到?反正我本身第一次看到的时候有种相见恨晚的感受,这简直就是我日思夜想的方式啊!这里你只须要经过
匿名内部类的方式实现AsyncHttpResponseHandler,并且更棒的是你只须要override感兴趣的方法,好比通常都是onSuccess和onFailure。
这个版本的get方法没有为请求传递任何参数,固然你也能够经过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对待,这时只须要匿名实现一个
TextHttpResponseHandler就行,其继承自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请求,代码以下:
String url = "https://ajax.googleapis.com/ajax/services/search/images"; 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 } });
看到了没,返回的response已经自动转化成JSONObject了,固然也支持JSONArray类型,override你须要的那个版本就行。
有了AsyncHttpClient,要实现这些功能是否是很简单呢?固然这里只是很初级的介绍和使用,剩下的还须要开发者本身参考官方
文档、源码(官方甚至提供了一个Sample使用的集合),在实际项目中实践。最后,强烈建议你们使用,是时候和冗长乏味的代码说
再见了。我一直是分析源码的,此次也不例外,实现上的关键代码我会在接下来的博客中专门介绍,敬请期待,enjoy。。。