若是说我比别人看得更远些,那是由于我站在了巨人的肩上。html
github地址:https://github.com/loopj/android-async-httpandroid
Api文档地址:http://loopj.com/android-async-http/doc/git
http通讯做为开发android最基本的模块,相信你们开发网络应用时都会须要用到。github
在初学android的时候本身经过Apache的HttpClient类库实现了一个简单的http通讯模块,线程安全,每次都要新建一个线程,经过Hander完成异步加载。json
后面经过github找到了这个类库,原理也相似,也用的是Apache的HttpClient,而Android官方的类库是HttpUrlConnection。数组
目前尚未认真研究过源码,设计封装的很好,今天就主要介绍一下这个类库。安全
介绍网络
AHC是基于Apache的HttpClient 库,全部的网络请求过程在UI线程以外进行,而回调是在Handler里面处理。也能够再Service或者后台程序里面使用,这个库会自动识别并在相应的Context进行处理。并发
特性app
继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息
接收请求结果,通常重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息
继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法,将请求结果由byte数组转换为String
继承自TextHttpResponseHandler,一样是重写onSuccess和onFailure方法,将请求结果由String转换为JSONObject或JSONArray
继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类须要提供实现,将请求结果解析成须要的类型,子类能够灵活地使用解析方法,能够直接原始解析,使用gson等。
请求参数,能够添加普通的字符串参数,并可添加File,InputStream上传文件
核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法便可,还能够选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,通常为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。
继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法。
使用方法在官方网站写的比较详细,demo里面也有,你们看看就懂了
以上内容参考:
http://www.cnblogs.com/angeldevil/p/3729808.html
http://blog.csdn.net/qduningning/article/details/34829429
目前主流数据都是用REST模式,json格式通讯,由于我仍是比较喜欢Gson(由于能够直接泛型转换),JsonHttpResponseHandler用不习惯。在实际项目中我又本身封装了一次,使用TextHttpResponseHandler获取结果后,用Gson解析。
android-async-http的封装
import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; public class RestHttpUtils { private static AsyncHttpClient client = new AsyncHttpClient(); static { client.addHeader("accept", "application/json"); } public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) { client.get(url, params, responseHandler); } public static void get(String url, AsyncHttpResponseHandler responseHandler) { client.get(url, null, responseHandler); } public interface RestHttpHandler<T> { public void onSuccess(T result); } }
Gson的封装
public class GsonUtils { private static Gson _gson = new Gson(); public static <T> T parse(String json, Class<T> T) { return _gson.fromJson(json, T); } public static <T> T parseList(String json, Type type) { return _gson.fromJson(json, type); } }
业务逻辑Controller
public class Controller {
public static void getDetail(final Context ctx, int id, final RestHttpHandler<Entity> handler) { RestHttpUtils.get(ApiUrls.getDetail() + "/id/" + id, new TextHttpResponseHandler() { @Override public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) { Toast.makeText(ctx, "获取详情失败", Toast.LENGTH_SHORT).show(); } @Override public void onSuccess(int arg0, Header[] arg1, String arg2) { Entity result = GsonUtils.parse(arg2, Entity.class); handler.onSuccess(result); } }); }
}
具体使用
Controller.getDetail(DetailActivity.this, getIntent().getIntExtra("Id", 0), new RestHttpHandler<Entity>() { @Override public void onSuccess(Entity result) {
//获取结果,进行一系列ui操做 }
});
PS:若是须要上传文件什么的,直接RequestParams.put(key,value),支持多种数据格式,而后post便可。