android-async-http AsyncHttpClient是一个非常好的Android针对http请求的开源框架。
AsyncHttpClient 是一个框架提供的库 可以异步传输,使用时需下载android-async-http-1.4.4.jar包导入到项目中
下载地址:http://loopj.com/android-async-http
在Android的开发中,发送和处理http请求是非常常见的事,但是对于http请求处理到处是充斥着又长又臭的代码。通常为了一个小小的数据,就要写大量代码。
因为针对最简单的case,我只需要提供request url,成功时的callback和(或)失败时的callback,仅此而已。针对这一类问题(需求),可以说android-async-http提供了几乎完美的解决方案。
特别是async关键字,看到这个字都知道,这是异步执行,也就是说它的网络请求自动在非UI线程里执行,你不需要任何额外的操作(比如手动new一个Thread之类)。
项目的官方网站:http://loopj.com/android-async-http/,对应的github地址:https://github.com/loopj/android-async-http
我这里简要介绍下:它是专门针对Android在Apache的HttpClient基础上构建的异步的callback-based http client。所有的请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在Service中或者后台线程中,库代码会自动识别出它所运行的context。
它有哪些特点:
1. 发送异步http请求,在匿名callback对象中处理response;
2. http请求发生在UI线程之外;
3. 内部采用线程池来处理并发请求;
4. GET/POST 参数构造,通过RequestParams类。
5. 内置多部分文件上传,不需要第三方库支持;
6. 流式Json上传,不需要额外的库;
7. 能处理环行和相对重定向;
8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
9. 自动智能的请求重试机制在各种各样的移动连接环境中;
10. 自动的gzip响应解码;
11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
13. 通过BaseJsonHttpResponseHandler和各种json库集成;
14. 支持SAX解析器;
15. 支持各种语言和content编码,不仅仅是UTF-8
使用AsynHttpClient发送http异步请求只需要实现以下步骤:
1. 创建一个AsyncHttpClient;
2. (可选的)通过RequestParams对象设置请求参数;
3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
如下是我在项目运用中的代码块:
/**
*构建httpClient实例对象
* 应用级别的HttpClient单例模式
* @since 2014-4-14 10:46:26
*/
public class AsyncHttpClient extends com.loopj.android.http.AsyncHttpClient {
public final static int TIME_OUT = 15000;
private AsyncHttpClient() {//私有化构造器
}
private static AsyncHttpClient mClient;
public static AsyncHttpClient getInstance() {//供外界获取实例,保证唯一性
if (mClient == null) {
mClient = new AsyncHttpClient();
mClient.setTimeout(TIME_OUT);//设置请求超时时间
}
return mClient;
}
}
/**
* 处理服务器响应的handler,供其他的handler继承并重写onSuccess和onFailure方法
* 根据本应用改良的ResponseHandler
* @since 2014-4-14 13:24:42
* @param <T>
*/
public abstract class SimpleResponseHandler<T> extends AsyncHttpResponseHandler {
protected final Context mContext;
private final Type mType;
/**
* @param context
* @param type
* 请到{@link TypeReferenceFactory}中取对应的{@link Type}
*/
public SimpleResponseHandler(Context context, Type type) {
mContext = context;
mType = type;
}
@Override
public void onSuccess(int statusCode, String result) {
BasicResponse<T> response = null;
try {
response = JSON.parseObject(result, mType);//使用fastjson解析返回数据
if (response == null)
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
onFailure(statusCode, R.string.net_get_data_failed, result);
return;
}
if (!response.getSuccess()) {
String msg = response.getMsg();
onFailure(
msg == null ? mContext.getResources().getString(
R.string.net_action_failed) : msg, response);
return;
}
onSuccess(response);
}
@Override
public void onFailure(int statusCode, int msgResource, String result) {
onFailure(mContext.getResources().getString(msgResource), null);
}
//响应成功的回调函数
public abstract void onSuccess(BasicResponse<T> result);
//响应失败的回调函数
public abstract void onFailure(String msg, BasicResponse<T> result);
}
这里是请求的传参方法。将参数put进去,这样就能将参数发送给服务器.
public static RequestParams getNewsParams(Context context, String id, int page) {
RequestParams params = new RequestParams();
params.put("id", id);
params.put("page", String.valueOf(page));
Log.i("request-params", params.toString());
return params;
}
这里是请求的响应返回数据并处理数据的模块
private class GetNewsResponseHandler extends
SimpleResponseHandler<NewsList> {
public GetNewsResponseHandler(Context context) {
super(context, TypeReferenceFactory.NEWS_LIST);
}
@Override
public void onSuccess(BasicResponse<NewsList> result) {
if (result.getResult() != null)
mNewsListList.addAll(result.getResult());
mNewsListListAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(String msg,BasicResponse<NewsList> result) {
Toast.makeText(getActivity(), msg,Toast.LENGTH_SHORT).show();
};
}
这样我们就可以请求服务器了。超级简单又方便,还能传送file文件作为参数。
AsyncHttpClient.getInstance().get(HttpPathConfig.GET_NEWS,
RequestParamsFactory.getNewsParams(this, id, Page), new GetNewsResponseHandler(this));