Android 网络框架:android-async-http
1,Android Asynchronous Http Client简介
android-async-http是封装了HttpClient的顶层实现,它所发起的Request全部运行于不同于UI线程的其它线程中,但它回调的处理逻辑和使用Handler发送message处理的回调逻辑一样,你也可以将它运行在Service线程或者background线程中。
特点:
- 异步HTTP请求,匿名回调响应函数
- 在其他线程而非UI线程中发送Request
- Requests使用线程池管理限制并发资源
- 可以自定义GET/POST参数
- 多种文件上传方式
- JSON数据的上传
- Request重试机制
- 解析多种数据格式
- 支持持久化存储Cookie
- 支持SAX解析
- 支持多种内容和语言编码格式,不仅仅是UTF-8
2,Android-async-http的使用
- 跟所有第三方库的使用一样,我们需要将其添加进我们的项目:可以直接下载最新.jar包( android-async-http.jar),也可以从github中将其clone到本地:android-async-http
- 如果是直接下载的.jar包,将其添加至项目libs文件夹下,并右键jar包,选择将其Add As Library:
- 如果是clone的项目,你还是需要将其编译成jar包,然后根据第1步操作添加进项目:以下是编译过程:
首先进入你clone的android-async-http目录下,然后在命令行执行如下命令
android update project -p ant jar
- 1
- 2
2.android-async-http的基本用法:
我们首选需要创建一个AsyncHttpClient实例,然后用它发起RequestAsyncHttpClietn client=new AsyncHttpClient(); client.get("http://www.baidu.com",new AsyncHttpResponseHandler(){ @Override public void onStart(){ //在Request发起前调用 } @Override public void onSuccess(int statusCode,Header[] headers,byte[] response){ //正确响应时调用,statusCode=200,headers代表响应http头部,response:响应返回值 } @Override public void onFailure(int statusCode,Header[] heards,byte[] errorResponse,Throwable e){ //未正确响应时调用:statusCode=401\403\404\... } @Override public void onRetry(int retryNo){ //重试请求时调用 } });
推荐用法:创建 static Http Client;
跟Volley框架一样,我们应该单独创建一个类,将我能需要的代码初始化,以便于全局持有某些对象。在这里将我们所需要的封装在一个static Client类中,可以根据自己的需求具体编写自定义Client类,具体的使用参考API: AsyncHttpClient, RequestParams and AsyncHttpResponseHandler
public class MyCLient{ private static final String BASE_URL="http://www.baidu.com"; //创建一个static client private static AsyncHttpClient client=new AsyncHttpClient(); //重写我们所需要的get,post等方法 public static get(String url,RequestParams params,AsyncHttpResonseHandler responseHand){ client.get(url,params,respnseHand) } public static post(String url,RequestParams params,aAsyncHttpResponseHandler responseHand){ client.post(url,params,responseHand); } } //然后在需要的地方调用即可, MyClient.get(url,params,new AsyncHttpResonseHandler(){...});
3.Cookie的存储:通过使用PersistentCookieStore,它实现了HttpClient中CookieStore接口,自动将Cookie存储到本地SharedPerferences中,常用来存储用户登录信息等。AsyncHttpClient client=new AsyncHttpClient(); PersistentCookieStore cookieStore=new PersistentCookieStore(context); client.setCookieStore(cookieStore); //当然你也可以自己将Cookie添加存储到本地,先创建Cookie对象,然后通过addCookie()添加 BasicClientCookie myCookie=new BasicClientCOokie("cookieuser","hh"); myCookie.setViersion(1); myCookie.setDomain("www.my.com"); myCookie.setPath("/"); client.addCookie(myCookie);
4.为Request添加GET/POST参数:需要用到RequestParams类,
创建方法有以下几种:RequestParams params=new RequestParams("username","coder"); //或者 RequestParams params=new RequestParams(); params.put("username","coder"); //也可以通过键值对Map对象添加 HashMap<String,String> map=new HashMap<String,String>(); map.put("username","coder"); RequestParams params=new RequestParams(map); .... //还记得前面写过的get(),post()方法吗,RequestParams即是它的第二个可选参数 client.get(url,params,new AsyncHttpResponseHandler(){..});
5.通过RequestParams上传文件:上面我们知道了如何试着RequestParams,那么怎么才能上传一个文件呢,可以通过以下三种方式:
通过输入流上传:
InputStream myInputStream = blah; RequestParams params = new RequestParams(); params.put("secret_passwords", myInputStream, “passwords.txt”);
通过文件对象上传:File myFile = new File("/path/to/file.png"); RequestParams params = new RequestParams(); try { params.put("profile_picture", myFile); } catch(FileNotFoundException e) {}
通过字节数组上传:
byte[] myByteArray = blah; RequestParams params = new RequestParams(); params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");
6.下载二进制文件:通过FileAsyncHttpResponseHandler类可以下载图片等二进制文件
AsyncHttpClient client=new AsyncHttpClient(); client.get("www.my.com/movies.jpg",new FileAsyncHttpResponseHandler(){ @Override public void Success(int statusCode,Header[] headers,File response){ //获取文件 } })
那我们如何发送其他类型的例如Json请求呢,其实观察可以发现只需要:new JsonHttpResponseHandler(){..}
7.HTTP身份验证Request:webservice中常需要进行身份验证,可通过以下两种方式实现:
AsyncHttpClient client=new AsyncHttpClient(); // client.setBasicAuth("username","password/token"); client.get("http://www.my.com"); //也可以设置更详细的验证范围 client.setBasicAuth("username","password",new AuthScope("www.my.com",80,AuthScope.ANY_REALM)); client.get("http://www.my.com");
以上即android-async-http 框架的基本用法,不写具体的Demo了,更多内容参见官网提供的API:android-sync-http API
总结:
Android网络框架的学习就告一段落了,主要介绍了Volley、Picasso、android-sync-http三种框架的使用,希望能对正在学习Android网络编程部分的同学有所帮助。
在使用中,我们需要根据自己的需求和各个框架的特点选择自己所需的框架,初期我们掌握基本的使用就可以了,很多时候我们应该去试着研究它们的源码,这样才能在以后的开发中运用自如。
其实几篇文章下来,我们可以发现开发中使用第三方框架基本上无非以下几步:
- 根据自己的需求去github等网站寻求目前比较流行的框架;
- 熟悉你所选定框架的特点和使用场景以及缺陷。
- 将对应jar包引入项目。
- 根据官方示例掌握基本用法。
- 多做练习,熟悉使用场景。
- 研究源码,改写框架以适应自己的需求。
接下来准备写篇实战的文章,灵活运用以上所学框架我们实现一个简单APP,有兴趣的关注微博或公众号,随时更新~~
参考资料:
Android Asynchronous Http Client
- 微博: @明桑Android黑历史
- 邮箱: <13141459344@163.com>
- 个人主页: 明桑战胜Android汪的黑历史