标签:android android asynchronous http http client
本文为译文,原文链接https://loopj.com/android-async-http/
安卓异步http客户端
概述
这是一个异步的基于回调的Android http客户端,构建于Apache httpclient库上。所有的请求都是独立于UI线程的,与此同时回调会由handler在发起请求的线程中执行。你也可以在后台线程和服务中使用它,这个库会自动识别它的运行环境。
特点
异步请求,回调处理。
不会阻塞UI线程。
使用线程池来负担并发请求。
GET/POST参数构建。
文件分部上传(不需要其它库的支持)。
流化上传JSON(不需要其它库的支持)
处理循环和相关的重定向。
包大小只有90kb
自动智能请求重试,对不稳定的移动链接而优化。
自动使用gzip响应编码,以支持超快请求。
二进制的通讯协议,使用BinaryHttpResponseHandler。
内建相应解析为JSOn的机制,使用JsonHttpResponseHandler。
直接保存相应,使用FileAsyncHttpResponseHandler。
持久的cookie存储,保存在SharedPreferences中。
集成 Jackson JSON,Gson以及其它JSON系列框架,通过使用BaseJsonHttpResponseHandler。
支持SAX解析,通过使用SaxAsyncHttpResponseHandler。
支持语言和内容的编码,不仅仅是UTF-8。
使用本库的高端App和开发者
安装和基本使用
添加maven依赖使用gradle构建。
dependencies {
compile ‘com.loopj.android:android-async-http:1.4.8‘
}
导入http包
import
com.loopj.android.http.*;
创建一个新的AsyncHttpClient 实例,并发送请求:
AsyncHttpClientclient
=
new
AsyncHttpClient();
client.get("https://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
}
});
推荐用法:创建一个静态的http客户端
在这个例子中,我们将创建一个http客户端,使用静态的访问器,使我们与Twitter的API的通信更容易。
importcom.loopj.android.http.*;
publicclass
TwitterRestClient
{
private
static
final
String
BASE_URL
=
"https://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;
}
}
这样话,你后面在使用Twitter的api就很容易了:
importorg.json.*;
importcom.loopj.android.http.*;
classTwitterRestClientUsage
{
public
void
getPublicTimeline()
throws
JSONException
{
TwitterRestClient.get("statuses/public_timeline.json",
null,
new
JsonHttpResponseHandler()
{
@Override
public
void
onSuccess(int
statusCode,
Header[]
headers,
JSONObject
response)
{
// If the response is JSONObject instead of expected JSONArray
}
@Override
public
void
onSuccess(int
statusCode,
Header[]
headers,
JSONArray
timeline)
{
// Pull out the first event on the public timeline
JSONObject
firstEvent
=
timeline.get(0);
String
tweetText
=
firstEvent.getString("text");
// Do something with the response
System.out.println(tweetText);
}
});
}
}
查看AsyncHttpClient, RequestParams 和AsyncHttpResponseHandler的java文档来了解更多。
持久的cookie存储,使用PersistentCookieStore
这个库也包含了一个持久的cookie存储功能,使用了apachehtpclient cookiestore接口,自动的存储cookies到sharedpreferences。
这个特别有用,当你想使用cookies来管理带你的鉴权会话,因为用户在退出或者重新打开你的app时,都可以保持登录状态。
第一步,建立一个AsyncHttpClient的实例:
AsyncHttpClientmyClient
=
new
AsyncHttpClient();
使用activity的context或者application的context来构建这个客户端的cookies的PersistentCookieStore实例。
PersistentCookieStoremyCookieStore
=
new
PersistentCookieStore(this);
myClient.setCookieStore(myCookieStore);
现在,任何从服务端获得的cookies将会持久的存储。
添加你自己的cookies,只要构建一个cookies然后调用addcookie。
BasicClientCookienewCookie
=
new
BasicClientCookie("cookiesare",
"awesome");
newCookie.setVersion(1);
newCookie.setDomain("mydomain.com");
newCookie.setPath("/");
myCookieStore.addCookie(newCookie);
看PersistentCookieStoreJavadoc 获得更多信息。
添加GET/POST参数,使用RequestParams
你的GET或者POST请求都可以添加参数。RequestParams
可以以下几种方式构建:
创建空的参数集并添加参数:
RequestParamsparams
=
new
RequestParams();
params.put("key","value");
params.put("more",
"data");
创建单参数的RequestParams :
RequestParamsparams
=
new
RequestParams("single",
"value");
从已有的Map中创建参数集:
HashMap<String,String>
paramMap
=
new
HashMap<String,
String>();
paramMap.put("key","value");
RequestParamsparams
=
new
RequestParams(paramMap);
看RequestParamsJavadoc 了解更多。
使用参数上传文件
参数集支持分部上传文件,如下:
添加输入流到参数来上传:
InputStreammyInputStream
=
blah;
RequestParamsparams
=
new
RequestParams();
params.put("secret_passwords",myInputStream,
"passwords.txt");
添加一个对象到参数来上传:
FilemyFile
=
new
File("/path/to/file.png");
RequestParamsparams
=
new
RequestParams();
try{
params.put("profile_picture",
myFile);
}catch(FileNotFoundException
e)
{}
添加一个比特数据到参数来上传:
byte[]myByteArray
=
blah;
RequestParamsparams
=
new
RequestParams();
params.put("soundtrack",new
ByteArrayInputStream(myByteArray),
"she-wolf.mp3");
看RequestParamsJavadoc 了解更多。
下载二进制数据使用FileAsyncHttpResponseHandler
FileAsyncHttpResponseHandler
可以用来下载二进制数据比如图片和其它文件。例子:
AsyncHttpClientclient
=
new
AsyncHttpClient();
client.get("https://example.com/file.png",new
FileAsyncHttpResponseHandler(/* Context */
this)
{
@Override
public
void
onSuccess(int
statusCode,
Header[]
headers,
File
response)
{
// Do something with the file `response`
}
});
看FileAsyncHttpResponseHandlerJavadoc 了解更多。
添加HTTP基本鉴权证书
一些API服务可能要求HTTP基本访问认证,因此可能需要给请求提供用户名/密码来认证。使用setBasicAuth()来提供认证。
对特定请求设置 username/password对任何主机和域名,默认的,认证对任何主机域名和端口都起作用。
AsyncHttpClientclient
=
new
AsyncHttpClient();
client.setBasicAuth("username","password/token");
client.get("https://example.com");
推荐,你也可以提供一个更详细的鉴权范围。
AsyncHttpClientclient
=
new
AsyncHttpClient();
client.setBasicAuth("username","password",new
AuthScope("example.com",
80,
AuthScope.ANY_REALM));
client.get("https://example.com");
看 RequestParams Javadoc 了解更多。
在设备上测试
你可以在真机或者模拟器上测试这个库,使用提供的例子程序。例子程序实现了所有的重要的库功能。你可以把它们当作实际代码的灵感。
例子程序:https://github.com/loopj/android-async-http/tree/master/sample
为了运行例子,从android-async-http的github库上克隆项目。并且在root下运行如下命令:
gradle :sample:installDebug
这个命令会安装例子程序在链接的机器上,所有的例子都可以快速的运行,如果不行,请在https://github.com/loopj/android-async-http/issues提交问题。
从源码构建
首先克隆项目,然后安装Android sdk 和 gradle,然后执行:
gradle :library:jarRelease
将会产生目标文件: {repository_root}/library/build/libs/library-1.4.8.jar
.
报告bug和特性需求
https://github.com/loopj/android-async-http/issues
工作人员和贡献者
James Smith (https://github.com/loopj)
Creator and Maintainer
Marek Sebera (https://github.com/smarek)
Maintainer since 1.4.4 release
Noor Dawod (https://github.com/fineswap)
Maintainer since 1.4.5 release
Luciano Vitti (https://github.com/xAnubiSx)
Collaborated on Sample Application
Jason Choy (https://github.com/jjwchoy)
Added support for RequestHandle feature
Micah Fivecoate (https://github.com/m5)
Major Contributor,including the original RequestParams
The Droid FuProject (https://github.com/kaeppler/droid-fu)
Inspiration and code for better httpretries
Rafael Sanches (https://blog.rafaelsanches.com)
Original SimpleMultipartEntity code
Anthony Persaud (https://github.com/apersaud)
Added support for HTTP BasicAuthentication requests.
Linden Darling (https://github.com/coreform)
Added support for binary/image responses
许可证
ApacheLicense, Version 2.0.
https://www.apache.org/licenses/LICENSE-2.0
关于作者
James Smith, Britishentrepreneur and developer based in San Francisco.
I‘m the co-founder of Bugsnag with Simon Maynard, andfrom 2009 to 2012 I led up the product team as CTO of Heyzap.
本文下载
http://download.csdn.net/detail/zhounanzhaode/8924505
Android Asynchronous Http Client 中文教程
标签:android android asynchronous http http client
原文地址:http://blog.csdn.net/zhounanzhaode/article/details/47011091