1.简介
Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android Handler message 机制传递信息。
2.特性
(1)采用异步http请求,并通过匿名内部类处理回调结果
(2)http请求独立在UI主线程之外
(3)采用线程池来处理并发请求
(4)采用RequestParams类创建GET/POST参数
(5)不需要第三方包即可支持Multipart file文件上传
(6)大小只有25kb
(7)自动为各种移动电话处理连接断开时请求重连
(8)超快的自动gzip响应解码支持
(9)使用BinaryHttpResponseHandler类下载二进制文件(如图片)
(10) 使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式
(11)持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中
3.使用方法
(1)到官网http://loopj.com/android-async-http/下载最新的android-async-http-1.4.4.jar,然后将此jar包添加进Android应用程序 libs文件夹
(2)通过import com.loopj.android.http.*;引入相关类
(3)创建异步请求
AsyncHttpClient client = new AsyncHttpClient();
client.post(url, reqParams, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
callBack.callback_success(response);
System.out.println(response);
}
});
不过实际使用中,在Fragement里面用,好像很不稳定,有时候能请求到,有时候请求不到。有些时候不会调用onSuccess函数。怀疑是该jar包中Handler对结果的处理有问题。
后来通过覆写其中的sendResponseMessage(HttpResponse response)函数,利用自己写的Handler对response结果进行截断处理,问题解决。注意
callback_success()回调函数。callback_success回调函数中的具体操作是自己写的,每个人的需求不同,这部分代码就不贴出来了。代码如下:
handler = new Handler() {
public void handleMessage(Message msg) {
int i = msg.what;
switch (i) {
case 1:
LogUtil.i(TAG, "---------------");
break;
case 2:
callBack.callback_error(0);
break;
default:
break;
}
};
};
client.post(url, reqParams, new AsyncHttpResponseHandler() {
@Override
public void sendResponseMessage(HttpResponse response) throws IOException {
// do not process if request has been cancelled
if (!Thread.currentThread().isInterrupted()) {
StatusLine status = response.getStatusLine();
HttpEntity entity = response.getEntity();
String string = EntityUtils.toString(entity, "UTF_8");
// additional cancellation check as getResponseData() can
// take non-zero time to process
if (!Thread.currentThread().isInterrupted()) {
LogUtil.i(TAG, "status.getStatusCode()----" + status.getStatusCode());
if (status.getStatusCode() == 200) {
Message message = Message.obtain();
message.what = 1;
message.obj = string;
handler.sendMessage(message);
} else {
Message message = Message.obtain();
message.what = 2;
handler.sendMessage(message);
}
}
}
}
各位如有类似问题,可以使用此法解决试试。欢迎大神指教。