如果说我比别人看得更远些,那是因为我站在了巨人的肩上。

github地址:https://github.com/loopj/android-async-http

Api文档地址:http://loopj.com/android-async-http/doc/

http通信作为开发android最基本的模块,相信大家开发网络应用时都会需要用到。

在初学android的时候自己通过Apache的HttpClient类库实现了一个简单的http通信模块,线程安全,每次都要新建一个线程,通过Hander完成异步加载。

后面通过github找到了这个类库,原理也类似,也用的是Apache的HttpClient,而Android官方的类库是HttpUrlConnection。

目前还没有认真研究过源码,设计封装的很好,今天就主要介绍一下这个类库。

介绍

AHC是基于Apache的HttpClient 库,所有的网络请求过程在UI线程之外进行,而回调是在Handler里面处理。也可以再Service或者后台程序里面使用,这个库会自动识别并在相应的Context进行处理。

特性

  1. 异步发送HTTP请求,在回调函数中处理响应
  2. HTTP请求过程不在UI线程进行
  3. 使用线程池来管理并发数
  4. 支持GET/POST请求参数单独设置
  5. 无需其他库上传序列化JSON数据
  6. 处理重定向
  7. 体积小,只有90K
  8. 针对不同的网络连接对重试次数进行智能优化
  9. 支持gzip
  10. 二进制通信协议使用BinaryHttpResponseHandler处理
  11. 内置Json解析,使用JsonHttpResponseHandler对响应进行处理
  12. 使用FileAsyncHttpResponseHandler直接将响应保存到文件中
  13. 动态保存Cookie,将Cookie保存到应用的SharedPreferences中
  14. 使用BaseJsonHttpResponseHandler可以搭配Jackson JSON,Gson或者其他的Json反序列化库
  15. 支持SAX解析,使用SaxAsyncHttpResponseHandler
  16. 支持多语言多种编码方式,不只是UTF-8

主要类介绍

  • AsyncHttpRequest

继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息

  • AsyncHttpResponseHandler

接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息

  • TextHttpResponseHandler

继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法,将请求结果由byte数组转换为String

  • JsonHttpResponseHandler

继承自TextHttpResponseHandler,同样是重写onSuccess和onFailure方法,将请求结果由String转换为JSONObject或JSONArray

  • BaseJsonHttpResponseHandler

继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类需要提供实现,将请求结果解析成需要的类型,子类可以灵活地使用解析方法,可以直接原始解析,使用gson等。

  • RequestParams

请求参数,可以添加普通的字符串参数,并可添加File,InputStream上传文件

  • AsyncHttpClient

核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。

  • SyncHttpClient

继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法。

使用方法在官方网站写的比较详细,demo里面也有,大家看看就懂了

以上内容参考:

http://www.cnblogs.com/angeldevil/p/3729808.html

http://blog.csdn.net/qduningning/article/details/34829429

目前主流数据都是用REST模式,json格式通信,因为我还是比较喜欢Gson(因为可以直接泛型转换),JsonHttpResponseHandler用不习惯。在实际项目中我又自己封装了一次,使用TextHttpResponseHandler获取结果后,用Gson解析。

android-async-http的封装

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams; public class RestHttpUtils {
private static AsyncHttpClient client = new AsyncHttpClient(); static {
client.addHeader("accept", "application/json");
} public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(url, params, responseHandler);
} public static void get(String url, AsyncHttpResponseHandler responseHandler) {
client.get(url, null, responseHandler);
} public interface RestHttpHandler<T> {
public void onSuccess(T result);
}
}

Gson的封装

public class GsonUtils {
private static Gson _gson = new Gson(); public static <T> T parse(String json, Class<T> T) {
return _gson.fromJson(json, T);
} public static <T> T parseList(String json, Type type) {
return _gson.fromJson(json, type);
}
}

业务逻辑Controller

public class Controller {
public static void getDetail(final Context ctx, int id, final RestHttpHandler<Entity> handler) {
RestHttpUtils.get(ApiUrls.getDetail() + "/id/" + id, new TextHttpResponseHandler() {
@Override
public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) {
Toast.makeText(ctx, "获取详情失败", Toast.LENGTH_SHORT).show();
} @Override
public void onSuccess(int arg0, Header[] arg1, String arg2) {
Entity result = GsonUtils.parse(arg2, Entity.class);
handler.onSuccess(result);
}
});
}
}

具体使用

Controller.getDetail(DetailActivity.this, getIntent().getIntExtra("Id", 0),
new RestHttpHandler<Entity>() { @Override
public void onSuccess(Entity result) {
              //获取结果,进行一系列ui操作
}
});

PS:如果需要上传文件什么的,直接RequestParams.put(key,value),支持多种数据格式,然后post即可。

Android开源库--Asynchronous Http Client异步http客户端的更多相关文章

  1. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  2. GitHub Top 100的Android开源库

    摘要: 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best M... 本项目主要对目前 GitH ...

  3. 【Java&amp;Android开源库代码分析】のandroid-async-http の开盘

          在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...

  4. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  5. <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介

    转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...

  6. GitHub上排名前100的Android开源库介绍

    GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...

  7. Android 开源库和项目 3

    Android 开源库和项目 Android 开源库和项目 2 1.Matisse Android 图片选择器 -- 知乎开源 github 地址:https://github.com/zhihu/M ...

  8. Android 开源库获取途径整理

    介绍眼下收藏 Android 开源库比較多的 GitHub 项目.站点.Twitter.App 及怎样获取最新的 Android 开源库. 微信号: 1. GitHub Android 开源项目汇总 ...

  9. 100个Github上Android开源库

    项目名称 项目简介 1. react-native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native, ...

随机推荐

  1. 国内外php主流开源cms、SNS、DIGG、RSS、Wiki汇总

    今年国内PHP开源CMS内容管理系统从程序框架,模版加载到程序功能上都有很大的进步,大部分都采用了自定义模块,自定义模型的方式,同时提供各个CMS都提供不同的特色功能,CMS内容管理系统一直影响着互联 ...

  2. 小试牛刀MVC简单网页

    上次我们创建了第一个MVC的网站,没用下,这次就简单来运行下,首先大家要去理解下MVC模式到底什么关系.在这里我就不多说,直接创建一个网页,用来显示一些数据,数据库的话我就先简单用这样创建先,为了方便 ...

  3. UML用例图(转载)

    概述: 为了模拟系统最重要的方面是捕捉到的动态行为.为了阐明位详细信息,动态的行为意味着它运行时/操作系统的行为. 因此,只有静态的行为是不够的模拟系统,而动态的行为,更重要的是比静态行为.在UML模 ...

  4. css 之优先策略

    <html> <head> <title>testCSS</title> <style type="text/css"> ...

  5. (转)xmpp 环境配置-支持扩展

    第一种方法直接拖 1> 拖入文件夹 在网盘链接的xmppFramework文件夹 :http://pan.baidu.com/s/1jGxLa3G 也可以直接去github搜索下载. 2> ...

  6. [读]剑指offer

    研二的开始找工作了,首先祝愿他们都能够找到自己满意的工作.看着他们的身影,自问明年自己这个时候是否可以从容面对呢?心虚不已,赶紧从老严那儿讨来一本<剑指offer>.在此顺便将自己做题所想 ...

  7. CodeIgniter API

    http://apigen.juzna.cz/doc/EllisLab/CodeIgniter/tree.html Classes CI_Benchmark CI_Calendar CI_Cart C ...

  8. WCF分布式开发步步为赢(9):WCF服务实例激活类型编程与开发

    .Net Remoting的激活方式也有三种:SingleTon模式.SingleCall模式.客户端激活方式,WCF服务实例激活类型包括三种方式:单调服务(Call Service),会话服务(Se ...

  9. php 修改 AppServ 下Apache 端口

    php 修改 AppServ 下Apache 端口 步骤一:把 C:\AppServ\Apache2.2\conf 中httpd.conf修改了 还不正确 步骤二:把httpd.conf  中List ...

  10. iOS开发--CornerStone上传静态库(.a文件)

    首先打开软件左上角 CornerStone-Preferences-SubVersion 第一个地方把对号去掉,第二个地方把.a那个删除,然后save. 然后把你的.a文件放到本地的相应文件夹下, 但 ...