首页 > 代码库 > Andorid Async-HttpClient解读

Andorid Async-HttpClient解读

Async-httpclient是一个用于Android应用程序开发的http访问开源框架,开源在GitHub上,由于今天在GitHub上没有看到下载地址,我这里提供一个下载地址,是之前从GitHub上下载的,版本是V1.4.5。GitHub上还是有很多开发人员提供了http访问的封装类,但是个人觉得Async-httpclient写的很不错,所以就总结下该开源包中的代码结构和调用方式。

Async-httpclient开源包中提供http的同步和异步访问,http的get、post、set、delete等方法,在调用http访问接口时针对传入不同的回调接口,返回数据也进行了不同的封装,待仔细阅读源码之后,将会明了。

当解开资源包之后,?\library\src\main\java\com\loopj\android\http该目录下就是作者写的源码了,就只有27个类,这里建议将?\library\src\main\java\目录下的文件夹com拷贝至Android工程的根目录下,并将其设置为“use as source folder”,这样在写调用例子的时候,就能去边看源码边写代码了。

源码包中主要的类有

AsyncHttpClient.java异步http访问类

SyncHttpClient.java同步http访问类

AsyncHttpRequest.java继承Runnable对象,真实访问http的线程

ResponseHandlerInterface.javahttp访问回调接口,有很多子类,分别对返回数据进行了封装

主要就是这个4大类,其余的还有https的证书自定义类、http重定向、base64、cookie的保存、http访问重试次数的设定等等。这些需要的时候可以添加。

在阅读源码时,ResponseHandlerInterface的子类众多,体验了一把什么是重载和覆写!这才是面向对象编程的思想。接下来一个简单的例子能看出使用此开源包的代码之简洁,可以少写很多不必要的重复代码。

ResponseHandlerInterface的子类关系如下:


在实际的开发中建议http访问实例写成单例。

public class MainActivity extends Activity {

	private static AsyncHttpClient mHttpClient = new AsyncHttpClient();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		getData() ;
	}

	public void getData(){
		mHttpClient.get("http://www.baidu.com", responseHandler) ;
	}
	
	AsyncHttpResponseHandler responseHandler = new AsyncHttpResponseHandler() {

		@Override
		public void onSuccess(int statusCode, Header[] headers,byte[] responseBody) {
			for(Header header :headers){
				Log.e("onSuccess","" + header.getName() + " = " + header.getValue()) ;
			}
			Log.e("onSuccess","statusCode = " + statusCode + ", responseBody = " + new String(responseBody)) ;
		}

		@Override
		public void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {
			for(Header header :headers){
				Log.e("onFailure","" + header.getName() + " = " + header.getValue()) ;
			}
			Log.e("onFailure","statusCode = " + statusCode + " ,responseBody = " + responseBody) ;
		}
	} ;	
}