利用android-async-http-1.4.4.jar异步网络请求客户端

来源:互联网 发布:网络安防监控系统布线 编辑:程序博客网 时间:2024/05/26 19:17
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() {@Overridepublic void sendResponseMessage(HttpResponse response) throws IOException {// do not process if request has been cancelledif (!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 processif (!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);}}}}
各位如有类似问题,可以使用此法解决试试。欢迎大神指教。

1 0
原创粉丝点击