在 iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http,目前非常火的应用Instagram和Pinterest的Android版就是用的这个网络请求库。这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。
通过Get请求指定的URL并通过回调函数处理请求结果,同时,请求方式还支持POST和PUT,请求的同时还支持参数传递,下面看看如何通过JSON字符串作为参数访问服务器:
官方推荐的使用方法,使用一个静态的请求对象。
下载:
上传:
其主要特征如下:
处理异步Http请求,并通过匿名内部类处理回调结果
Http请求均位于非UI线程,不会阻塞UI操作
通过线程池处理并发请求
处理文件上传、
下载
响应结果自动打包JSON格式
自动处理连接断开时请求重连
使用android-async-http也非常简单,文章下面是下载jar地址,导入工程中libs文件夹下并添加到工程路径即可。通过下面的代码来创建一个异步请求:
官方推荐的使用方法,使用一个静态的请求对象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
public
class
HttpUtil {
private
static
AsyncHttpClient client =
new
AsyncHttpClient();
// 实例话对象
static
{
client.setTimeout(
10000
);
// 设置链接超时,如果不设置,默认为10s
}
// 用一个完整url获取一个string对象
public
static
void
get(String urlString, AsyncHttpResponseHandler res)
{
client.get(urlString, res);
}
// url里面带参数
public
static
void
get(String urlString, RequestParams params,
AsyncHttpResponseHandler res){
client.get(urlString, params, res);
}
// 不带参数,获取json对象或者数组
public
static
void
get(String urlString, JsonHttpResponseHandler res) {
client.get(urlString, res);
}
// 带参数,获取json对象或者数组
public
static
void
get(String urlString, RequestParams params,
JsonHttpResponseHandler res) {
client.get(urlString, params, res);
}
// 下载数据使用,会返回byte数据
public
static
void
get(String uString, BinaryHttpResponseHandler bHandler) {
client.get(uString, bHandler);
}
public
static
AsyncHttpClient getClient(){
return
client;
}
}
|
下载:
android-async-http (android-async-http-cached)是基于 Android Asynchronous HTTP Library (https://github.com/loopj/android-async-http) 实现。
1.增加响应数据本地缓存功能。
2.便于JSON-RPC,XML-RPC方式调用。
用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
public
class
TestActivity
extends
Activity {
private
static
final
int
REQUEST_GET_ID =
0
;
private
static
final
int
REQUEST_POST_ID =
1
;
private
static
final
int
REQUEST_POST_JSON_ID =
2
;
private
static
final
int
REQUEST_POST_XML_ID =
3
;
private
RequestManager mRequestManager;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
this
.mRequestManager = RequestManager
.getInstance(getApplicationContext());
get();
postParams();
postJSONObject();
postXML();
}
/**
* get by url
*/
private
void
get() {
this
.mRequestManager
.get(
"http://app.shafa.com/api/push/download/52a093cf3bf55d361e000477?response-content-type=application%2fvnd.android.package-archive"
,
null
, requestListener,
true
, REQUEST_GET_ID);
}
/**
* post by RequestParams
*/
private
void
postParams() {
final
RequestParams params =
new
RequestParams();
params.put(
"key1"
,
"value1"
);
params.put(
"key2"
,
"value2"
);
this
.mRequestManager.post(
"http://server.winfirm.net/memoServer"
,
params, requestListener, REQUEST_POST_ID);
}
/**
* post by JSONObject
*/
private
void
postJSONObject() {
final
JSONObject json =
new
JSONObject();
try
{
json.put(
"key1"
,
"value1"
);
json.put(
"key2"
,
"value2"
);
}
catch
(JSONException e) {
e.printStackTrace();
}
this
.mRequestManager.post(
"http://server.winfirm.net/memoServer"
, json,
requestListener, REQUEST_POST_JSON_ID);
}
/**
* post by xml
*/
private
void
postXML() {
final
String xml =
"<?xml version=\"1.0\" encoding=\"utf-8\"?><key1>value1</key1><key2>value2</key2>"
;
this
.mRequestManager.post(
"http://server.winfirm.net/memoServer"
, xml,
requestListener, REQUEST_POST_XML_ID);
}
/**
* request listener
*/
private
RequestListener requestListener =
new
RequestListener() {
@Override
public
void
onStart() {
}
@Override
public
void
onCompleted(
int
statusCode,
byte
[] data,
String description,
int
actionId) {
try
{
System.out.println(
new
String(data,
"UTF-8"
));
}
catch
(Exception e) {
e.printStackTrace();
}
if
(REQUEST_GET_ID == actionId) {
if
(RequestListener.OK == statusCode) {
// sucess
}
else
{
// handler error case
}
}
else
if
(REQUEST_POST_ID == actionId) {
}
else
if
(REQUEST_POST_JSON_ID == actionId) {
}
else
if
(REQUEST_POST_XML_ID == actionId) {
}
}
@Override
public
void
onProgress(
int
bytesWritten,
int
totalSize,
int
actionId) {
System.out.println(bytesWritten +
"/"
+ totalSize);
}
};
}
|
项目主页:http://www.open-open.com/lib/view/home/1426475044976