开源项目链接

android-async-http仓库:git clone https://github.com/loopj/android-async-http

android-async-http主页:http://loopj.com/android-async-http/


背景知识

开始使用分析前还是先了解下Android的HTTP一些过往趣事:

关于Android HTTP推荐的Google官方链接

HttpClient拥有众多的API,实现稳定,bug很少。 HttpURLConnection是一种多用途、轻量的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。 HttpURLConnection的API比较简单、扩展容易。不过在Android 2.2版本之前,HttpURLConnection一直存在着一些bug。 比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。 所以说2.2之前推荐使用HttpClient,2.2之后推荐HttpURLConnection。

好了,那现在话又说回来,在android-async-http中使用的是HttpClient。哎…好像在Volley中分析过Volley对不同版本进行了判断, 所以针对不同版本分别使用了HttpClient和HttpURLConnection。还是google牛逼啊!

回过神继续android-async-http吧,不瞎扯了。

android-async-http是专门针对Android在Apache的HttpClient基础上构建的异步http连接。所有的请求全在UI(主)线程之外执行, 而callback使用了Android的Handler发送消息机制在创建它的线程中执行。

类似Volley一样,使用一个优秀框架之前就是必须得先知道他的特性,如下就是android-async-http的特性:

  1. 发送异步http请求,在匿名callback对象中处理response信息;
  2. http请求发生在UI(主)线程之外的异步线程中;
  3. 内部采用线程池来处理并发请求;
  4. 通过RequestParams类构造GET/POST;
  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最简单基础的使用只需如下步骤:

  1. 创建一个AsyncHttpClient;
  2. (可选的)通过RequestParams对象设置请求参数;
  3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类 ,实现了AsyncHttpResponseHandler,类库自己也提供许多现成的response handler,你一般不需要自己创建。

AsyncHttpClient与AsyncHttpResponseHandler基础GET体验

AsyncHttpClient类通常用在android应用程序中创建异步GET, POST, PUT和DELETE HTTP请求, 请求参数通过RequestParams实例创建,响应通过重写匿名内部类ResponseHandlerInterface方法处理。

如下代码展示了使用AsyncHttpClient与AsyncHttpResponseHandler的基础操作:

  1. AsyncHttpClient client = new AsyncHttpClient();
  2. client.get("www.baidu.com", new AsyncHttpResponseHandler() {
  3. @Override
  4. public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
  5. }
  6. @Override
  7. public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
  8. }
  9. @Override
  10. public void onStart() {
  11. super.onStart();
  12. }
  13. @Override
  14. public void onFinish() {
  15. super.onFinish();
  16. }
  17. @Override
  18. public void onRetry(int retryNo) {
  19. super.onRetry(retryNo);
  20. }
  21. @Override
  22. public void onCancel() {
  23. super.onCancel();
  24. }
  25. @Override
  26. public void onProgress(int bytesWritten, int totalSize) {
  27. super.onProgress(bytesWritten, totalSize);
  28. }
  29. });

官方推荐AsyncHttpClient静态实例化的封装

注意:官方推荐使用一个静态的AsyncHttpClient,官方示例代码如下:

  1. public class TwitterRestClient {
  2. private static final String BASE_URL = "http://api.twitter.com/1/";
  3. private static AsyncHttpClient client = new AsyncHttpClient();
  4. public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
  5. client.get(getAbsoluteUrl(url), params, responseHandler);
  6. }
  7. public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
  8. client.post(getAbsoluteUrl(url), params, responseHandler);
  9. }
  10. private static String getAbsoluteUrl(String relativeUrl) {
  11. return BASE_URL + relativeUrl;
  12. }
  13. }

通过官方这个推荐例子可以发现,我们在用时可以直接通过类名调用需要的请求方法。所以我们可以自己多封装一些不同的请求方法,比如参数不同的方法,下载方法, 上传方法等。


RequestParams的基础使用

  1. RequestParams params = new RequestParams();
  2. params.put("username", "yanbober");
  3. params.put("password", "123456");
  4. params.put("email", "yanbobersky@email.com");
  5. /*
  6. * Upload a File
  7. */
  8. params.put("file_pic", new File("test.jpg"));
  9. params.put("file_inputStream", inputStream);
  10. params.put("file_bytes", new ByteArrayInputStream(bytes));
  11. /*
  12. * url params: "user[first_name]=jesse&user[last_name]=yan"
  13. */
  14. Map<String, String> map = new HashMap<String, String>();
  15. map.put("first_name", "jesse");
  16. map.put("last_name", "yan");
  17. params.put("user", map);
  18. /*
  19. * url params: "what=haha&like=wowo"
  20. */
  21. Set<String> set = new HashSet<String>();
  22. set.add("haha");
  23. set.add("wowo");
  24. params.put("what", set);
  25. /*
  26. * url params: "languages[]=Java&languages[]=C"
  27. */
  28. List<String> list = new ArrayList<String>();
  29. list.add("Java");
  30. list.add("C");
  31. params.put("languages", list);
  32. /*
  33. * url params: "colors[]=blue&colors[]=yellow"
  34. */
  35. String[] colors = { "blue", "yellow" };
  36. params.put("colors", colors);
  37. /*
  38. * url params: "users[][age]=30&users[][gender]=male&users[][age]=25&users[][gender]=female"
  39. */
  40. List<Map<String, String>> listOfMaps = new ArrayList<Map<String, String>>();
  41. Map<String, String> user1 = new HashMap<String, String>();
  42. user1.put("age", "30");
  43. user1.put("gender", "male");
  44. Map<String, String> user2 = new HashMap<String, String>();
  45. user2.put("age", "25");
  46. user2.put("gender", "female");
  47. listOfMaps.add(user1);
  48. listOfMaps.add(user2);
  49. params.put("users", listOfMaps);
  50. /*
  51. * 使用实例
  52. */
  53. AsyncHttpClient client = new AsyncHttpClient();
  54. client.post("http://localhost:8080/androidtest/", params, responseHandler);

JsonHttpResponseHandler带Json参数的POST

  1. try {
  2. JSONObject jsonObject = new JSONObject();
  3. jsonObject.put("username", "ryantang");
  4. StringEntity stringEntity = new StringEntity(jsonObject.toString());
  5. client.post(mContext, "http://api.com/login", stringEntity, "application/json", new JsonHttpResponseHandler(){
  6. @Override
  7. public void onSuccess(JSONObject jsonObject) {
  8. super.onSuccess(jsonObject);
  9. }
  10. });
  11. } catch (JSONException e) {
  12. e.printStackTrace();
  13. } catch (UnsupportedEncodingException e) {
  14. e.printStackTrace();
  15. }

BinaryHttpResponseHandler下载文件

  1. client.get("http://download/file/test.java", new BinaryHttpResponseHandler() {
  2. @Override
  3. public void onSuccess(byte[] arg0) {
  4. super.onSuccess(arg0);
  5. File file = Environment.getExternalStorageDirectory();
  6. File file2 = new File(file, "down");
  7. file2.mkdir();
  8. file2 = new File(file2, "down_file.jpg");
  9. try {
  10. FileOutputStream oStream = new FileOutputStream(file2);
  11. oStream.write(arg0);
  12. oStream.flush();
  13. oStream.close();
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. Log.i(null, e.toString());
  17. }
  18. }
  19. });

RequestParams上传文件

  1. File myFile = new File("/sdcard/test.java");
  2. RequestParams params = new RequestParams();
  3. try {
  4. params.put("filename", myFile);
  5. AsyncHttpClient client = new AsyncHttpClient();
  6. client.post("http://update/server/location/", params, new AsyncHttpResponseHandler(){
  7. @Override
  8. public void onSuccess(int statusCode, String content) {
  9. super.onSuccess(statusCode, content);
  10. }
  11. });
  12. } catch(FileNotFoundException e) {
  13. e.printStackTrace();
  14. }

PersistentCookieStore持久化存储cookie

官方文档里说PersistentCookieStore类用于实现Apache HttpClient的CookieStore接口, 可自动将cookie保存到Android设备的SharedPreferences中, 如果你打算使用cookie来管理验证会话,这个非常有用,因为用户可以保持登录状态,不管关闭还是重新打开你的app。

文档里介绍了持久化Cookie的步骤:

  1. 创建 AsyncHttpClient实例对象;
  2. 将客户端的cookie保存到PersistentCookieStore实例对象,带有activity或者应用程序context的构造方法;
  3. 任何从服务器端获取的cookie都会持久化存储到myCookieStore中,添加一个cookie到存储中,只需要构造一个新的cookie对象,并且调用addCookie方法;

下面这个例子就是铁证:

  1. AsyncHttpClient client = new AsyncHttpClient();
  2. PersistentCookieStore cookieStore = new PersistentCookieStore(this);
  3. client.setCookieStore(cookieStore);
  4. BasicClientCookie newCookie = new BasicClientCookie("name", "value");
  5. newCookie.setVersion(1);
  6. newCookie.setDomain("mycompany.com");
  7. newCookie.setPath("/");
  8. cookieStore.addCookie(newCookie);

总结性的唠叨几句

AsyncHttpResponseHandler是一个请求返回处理、成功、失败、开始、完成等自定义的消息的类,如上第一个基础例子中所示。

BinaryHttpResponseHandler是继承AsyncHttpResponseHandler的子类,这是一个字节流返回处理的类,用于处理图片等类。

JsonHttpResponseHandler是继承AsyncHttpResponseHandler的子类,这是一个json请求返回处理服务器与客户端用json交流时使用的类。

AsyncHttpRequest继承自Runnable,是基于线程的子类,用于异步请求类, 通过AsyncHttpResponseHandler回调。

PersistentCookieStore继承自CookieStore,是一个基于CookieStore的子类, 使用HttpClient处理数据,并且使用cookie持久性存储接口。

PS:例子用的在牛逼还不如阅读开头列出的官方文档和源码吧。

android-async-http框架库使用基础的更多相关文章

  1. Java/Android 网络请求框架/库

    Android 图片缓存框架  最上面的最优先 com.facebook.fresco:fresco:0.12.0                7.26.2016最新 Universal-Image ...

  2. Android 必须知道2018年流行的框架库及开发语言,看这一篇就够了!

    导语 2017 已经悄悄的走了,2018 也已经匆匆的来了,我们在总结过去的同时,也要展望一下未来,来规划一下今年要学哪些新技术.这几年优秀Android的开源库不断推出,新技术层出不穷,需要我们不断 ...

  3. 各种Android UI开源框架 开源库

    各种Android UI开源框架 开源库 转 https://blog.csdn.net/zhangdi_gdk2016/article/details/84643668 自己总结的Android开源 ...

  4. Android应用程序框架层和系统运行库层日志系统源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6598703 在开发Android应用程序时,少 ...

  5. 15 个 Android 通用流行框架大全(转)

    1. 缓存 DiskLruCache    Java实现基于LRU的磁盘缓存 2.图片加载 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库 Picas ...

  6. Android 通用流行框架

    原文出处: http://android.jobbole.com/83028/ 1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的磁盘缓存 2.图片加载 名称 描述 Andro ...

  7. 经受时间沉淀的15 个 Android 通用流行框架大全

    1. 缓存 名称描述 DiskLruCache: Java实现基于LRU的磁盘缓存 2.图片加载 名称描述 Android    Universal Image Loader 一个强大的加载,缓存,展 ...

  8. Android通用流行框架大全

    1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的磁盘缓存 2.图片加载 名称 描述 Android Universal Image Loader 一个强大的加载,缓存,展示图 ...

  9. 60.Android通用流行框架大全

    转载:https://segmentfault.com/a/1190000005073746 Android通用流行框架大全 1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的 ...

随机推荐

  1. 洛谷 P1344 追查坏牛奶Pollutant Control —— 最小割

    题目:https://www.luogu.org/problemnew/show/P1344 就是求最小割: 但是还要边数最小,所以把边权都*1001+1,这样原来流量部分是*1001,最大流一样的不 ...

  2. pssh 批量管理执行

    pssh 是一个python写的批量执行工具,非常适合30台服务器以内的一些重复性的操作 安装很简单,只要python版本2.4 以上的都行 用这个工作最好把机器做做好ssh信任关系,不然很麻烦 每次 ...

  3. 分析函数Ratio_to_report使用

    分析函数Ratio_to_report( ) over()使用说明 表中需要计算单项占比:比如单项在部门占比多少,单项在公司占比多少.特别是在财务单项计算,部门个人薪水计算上. Ratio_to_re ...

  4. 字符设备驱动另一种写法—mmap方法操作LED

    最近在看韦老师的视频,讲解了很多种字符设备的驱动写法.经过自己的研究之后,我发现还有另外一种写法,直接在应用层操作,省去了内核中的地址映射部分,使得用户可以在应用层直接操作LED.        mm ...

  5. PCB CAM自动化后台配置说明

    CAM自动化项目经历9个月时间里,在我们IT团队与工程部深入合作下,依据PCB各种场景定制特定功能,且这几个月里在不断的改进与迭代脚本功能,在此期间攻破了一个又一个难题,最终项目第一阶段已顺立上线运行 ...

  6. bzoj 3270: 博物馆【dp+高斯消元】

    好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]: 然后根据题意,得到转移是 \[ f[i][j]=f[i][j]*p_ ...

  7. 《Windows核心编程系列》十一谈谈Windows线程池

    Windows线程池 上一篇博文我们介绍了IO完成端口.得知IO完成端口可以非常智能的分派线程.但是IO完成端口仅对等待它的线程进行分派,创建和销毁线程的工作仍然需要我们自己来做. 我们自己也可以创建 ...

  8. 洛谷 P1501 [国家集训队]Tree II

    看来这个LCT板子并没有什么问题 #include<cstdio> #include<algorithm> using namespace std; typedef long ...

  9. AsyncTask官方教程-推荐用AsyncTask少用Thread

    Using AsyncTask AsyncTask allows you to perform asynchronous work on your user interface. It perform ...

  10. 【转】Java中,&&与&,||与|的区别

    转自:http://blog.csdn.net/lishiyuzuji/article/details/8116516 在Java的逻辑运算符中,有这么四类:&&(短路与),& ...