这是一个异步的基于回调函数的安卓 Http客户端 ,底层使用的是 Apache 的 HttpClient 库。所有 的请求都是 在妳的程序中主界面线程之外的线程中发起的,但是,所有 的回调逻辑都是使用安卓 的 处理器 (Handler)消息传递机制来在创建该回调对象的相同线程中执行的。 妳还可以 在 服务 (Service)或者后台线程中使用它, 这个库会自动识别自己是运行于哪个上下文中。
•. 发起 异步 的 HTTP请求, 并在 匿名回调对象 中处理回复内容
•. HTTP请求 是 在界面线程之外 发生的
•. 所有 的请求会使用 线程 池 来限制并发的资源使用程度
•. GET/POST 参数构建 器 (RequestParams)
•. 无需第三 方库即可支持 多部分的( Multipart )文件上传
•. 无需第三 方库即可支持 流式 JSON 上传
•. 可处理循环重定向及相对重定向
•. 只会给妳的程序增加一点点尺寸, 库的所有东西加起来才 90kb
•. 针对 极不稳定的移动网络,自动进行智能 请求重试
•. 自动进行 gzip 回复内容 的解码,支持超快的请求
•. 使用 BinaryHttpResponseHandler 支持二进制协议通信
•. 使用 JsonHttpResponseHandler 提供 了内置的 JSON 解析功能
•. 使用 FileAsyncHttpResponseHandler 将回复内容直接保存到文件中
•. 持久 化小甜饼( cookie )存储 ,会将小甜饼存储到妳的程序的 共享首选项 (SharedPreferences)里
•. 使用 BaseJsonHttpResponseHandler ,可与 Jackson JSON 、 Gson 或别的 JSON序列 化(反序列化)库整合起来
•. 使用 SaxAsyncHttpResponseHandler 支持SAX 解析 器
•.支持不同的语言及内容编码方式,不仅仅是UTF-8
使用Gradle 构建脚本格式来添加maven 依赖
dependencies {
compile 'com.loopj.android:android-async-http:1.4.5'
}
导入http包。
import com.loopj.android.http.* ;
创建 一个新的 AsyncHttpClient 实例, 发起一个请求:
AsyncHttpClient client = new AsyncHttpClient ();
client . get ( "http://www.google.com" , new AsyncHttpResponseHandler () {
@Override
public void onStart () {
// 在请求开始之前会调用这个方法
}
@Override
public void onSuccess ( int statusCode , Header [] headers , byte [] response ) {
// 当回复的 HTTP状态 码是 "200 OK" 时会调用这个方法
}
@Override
public void onFailure ( int statusCode , Header [] headers , byte [] errorResponse , Throwable e ) {
// 当回复的 HTTP状态 码是 "4XX" (例如401 、 403 、 404) 时会调用这个方法
}
@Override
public void onRetry ( int retryNo ) {
// 当该请求进行了重试时会调用这个方法
}
});
在这个示例里,我们会创建一个带有静态访问函数的http客户端类,这样就能够轻松地与 推特 (Twitter)的应用编程接口进行通信。
import com.loopj.android.http.* ;
public class TwitterRestClient {
private static final String BASE_URL = "http://api.twitter.com/1/" ;
private static AsyncHttpClient client = new AsyncHttpClient ();
public static void get ( String url , RequestParams params , AsyncHttpResponseHandler responseHandler ) {
client . get ( getAbsoluteUrl ( url ), params , responseHandler );
}
public static void post ( String url , RequestParams params , AsyncHttpResponseHandler responseHandler ) {
client . post ( getAbsoluteUrl ( url ), params , responseHandler );
}
private static String getAbsoluteUrl ( String relativeUrl ) {
return BASE_URL + relativeUrl ;
}
}
然后,就可以在妳的代码中轻易地使用推特的应用编程接口了:
import org.json.* ;
import com.loopj.android.http.* ;
class TwitterRestClientUsage {
public void getPublicTimeline () throws JSONException {
TwitterRestClient . get ( "statuses/public_timeline.json" , null , new JsonHttpResponseHandler () {
@Override
public void onSuccess ( int statusCode , Header [] headers , JSONObject response ) {
// 如果回复结果 是一个 JSONObject ,而不是预期的 JSONArray 的话则会调用这个方法
}
@Override
public void onSuccess ( int statusCode , Header [] headers , JSONArray timeline ) {
// 从公共时间线中解析出第一个事件
JSONObject firstEvent = timeline . get (0);
String tweetText = firstEvent . getString ( "text" );
// 对于回复内容 做一些处理
System . out . println ( tweetText );
}
});
}
}
参考 AsyncHttpClient 、 RequestParams 和 AsyncHttpResponseHandler 的Javadoc以了解更多细节。
FileAsyncHttpResponseHandler 类可用来获取二进制数据,例如图片和其它文件。例如:
AsyncHttpClient client = new AsyncHttpClient ();
client . get ( "http://example.com/file.png" , new FileAsyncHttpResponseHandler () {
@Override
public void onSuccess ( int statusCode , Header [] headers , File response ) {
// 针对文件`response` 做一些处理
}
});
参考 FileAsyncHttpResponseHandler 的 Javadoc 以了解更多信息。
HxLauncher: Launch Android applications by voice commands