天天看点

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

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);

						}
					}
				}
			}
           

各位如有类似问题,可以使用此法解决试试。欢迎大神指教。