一、什么是AsyncHttpClient
专门针对Android在Apache的HttpClient基础上构建的异步的callback-based http client
二、AsyncHttpClient的特点
- 发送异步http请求,在匿名callback对象中处理response;
- http请求发生在UI线程之外;
- 内部采用线程池来处理并发请求;
- GET/POST 参数构造,通过RequestParams类
- 内置多部分文件上传,不需要第三方库支持;
- 流式Json上传,不需要额外的库;
- 能处理环行和相对重定向;
- 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
- 自动智能的请求重试机制在各种各样的移动连接环境中;
- 自动的gzip响应解码;
- 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
- 永久的cookie保存,内部实现用的是Android的SharedPreferences;
- 通过BaseJsonHttpResponseHandler和各种json库集成;
- 支持SAX解析器;
- 支持各种语言和content编码,不仅仅是UTF-8。
三、使用AsyncHttpClient的步骤
- 创建一个AsyncHttpClient;
- (可选的)通过RequestParams对象设置请求参数;
- 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
四、在代码中实现android-async-http
1、在gradle添加依赖库
compile 'com.loopj.android:android-async-http:1.4.9'
2、在Activity中写入(这是最简单的一种方法)
//创建一个新AsyncHttpClient实例并发出请求
AsyncHttpClient client = new AsyncHttpClient();
//AsyncHttpClient中有get和post两种方法
//第一个参数是所要获取接口,第二个参数是所发出的请求
client.get("https://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
Toast.makeText(MainActivity.this,responseString,Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
Toast.makeText(MainActivity.this,"fail",Toast.LENGTH_SHORT).show();
}
});
3、建议方法:创建一个静态的Http客户端
01、创建类(类名自定义),写入路径,方法
public class AsyncHttp {
//定义String类型来接收接口相同的部分
private static final String BASE_URL = "http://192.168.1.101:8890/type/jason/action/";
private static AsyncHttpClient client = new AsyncHttpClient();
//get方法
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
}
//post方法
public static void post(Context context, String url, HttpEntity entity, String contentType, AsyncHttpResponseHandler responseHandler) {
client.post(context, getAbsoluteUrl(url), entity, contentType, responseHandler);
}
////单独写一个方法添加URL不同的地方
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
}
02、在Activity中获取数据
//引号中的是参数名,第二个是返回的值
AsyncHttp.get("getSensor", null, new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
//显示失败 Toast.makeText(MainActivity.this,"fail",Toast.LENGTH_SHORT).show();
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
//显示成功,弹跳出来 Toast.makeText(MainActivity.this,responseString,Toast.LENGTH_SHORT).show();
}
});
03、传参方法(RequestParams)
RequestParams requestParams=new RequestParams();
requestParams.put("params","{\"classify_id\":70,\"page\":1,\"page_count\":2}");
//params:键,第二个是值
4、AsyncHttpClient的post方法发送JSON格式参数
//定义json对象
JSONObject jsonObject=new JSONObject();
try {
//解析json数据
jsonObject.put("Roadlamp",1);
} catch (JSONException e) {
e.printStackTrace();
}
ByteArrayEntity entity=null;
try {
entity=new ByteArrayEntity(jsonObject.toString().getBytes("UTF-8"));
//用application/json向其传达这是json类型的接口数据
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
AsyncHttp .post(MainActivity.this,"control",entity,"application/json",new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
Log.e("rs",response.toString());
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
}
});