在Android中为我们提供了两种Http请求方式:HttpURLConnection以及HttpClient。这两者可以帮助我们了解在Android中对HTTP请求的处理。但是一般实际开发中都是使用别人封装好的第三方网络请求框架,因为网络操作涉及到异步以及多线程,自己动手实现的话很麻烦。而这些第三方框架在优化上还更好。本文介绍其中一个框架:android-async-http的使用。
android-async-http介绍
查看官方文档:android-async-http
android-async-http是基于Apache HttpClient专门用于android的异步http请求,所有的请求都在非UI线程执行。API比较全面,使用比较简单,而且在CallBack中使用了Handler消息机制,我们可以在回调方法onSuccess,onFailure等中直接对UI进行操作。
功能
- 用HttpClient代替Android提供的DefaultHttpClient;
- 兼容Android API 23以及更高;
- 发送异步http请求,在匿名的callback对象中处理response信息;
- 在非UI线程执行http请求;
- 使用线程池处理并发请求;
- RequestParams作为GET/POST参数构造器;
- 多部件文件上传,不需要引入第三方库;
- JSON数据流上传,不需要引入库;
- 能处理循环行和相对重定向;
- 对应用来说库很小,总共只有90KB;
- 使多种多样的移动连接具备良好自动智能请求重试机制;
- 支持超快速请求的自动gzip响应解码;
- BinaryHttpResponseHandler支持二进制通讯协议;
- 通过JsonHttpResponseHandler实现内置解析response成JSON格式;
- 通过FileAsyncHttpResponseHandler实现直接将response写入保存到文件中;
- 持久化的cookie存储,将cookie保存到应用程序的SharePreferences中;
- 通过BaseJsonHttpResponseHandler集成Jackson Json,Gson和其他的JSON序列化库;
- 通过SaxAsyncHttpResponseHandler支持SAX解析;
- 支持各种语言和内容编码,不是只有UTF-8;
使用步骤
在如图所示的文件中找到dependencies然后加上:
dependencies {
...
implementation 'com.loopj.android:android-async-http:1.4.9'
...
}
当然,你也可以选择从官网下载jar包,然后在工程中添加它。
然后,我们就可以使用这个框架了:
- 创建AsyncHttpClient对象
- 如果需要参数,可以创建RequestParams对象添加参数
按需要调用AsyncHttpClient的GET/POST方法,传递需要的回调接口实现。
下面给出一个简单的例子:
public void UserLogin(String username,String password){
AsyncHttpClient client=new AsyncHttpClient();//创建AsyncHttpClient对象
String url="你要发起请求的url";
RequestParams params=new RequestParams();//因为有参数,所以创建RequestParams对象
params.put("un",username);//放入用户名
params.put("pwd",password);//放入密码,根据需要,RequestParams对象还可以放入文件等。。
client.post(url,params,new JsonHttpResponseHandler(){//向服务端发起post请求,根据服务端的返回信息,传入不同的回调接口实现,我这里因为服务端返回的是JSON数据所以使用 JsonHttpResponseHandler
//重写onSuccess方法
@Override
public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
/*做你需要做的事,如更新UI等*/
Toast.makeText(Login.this,"登录成功"+statusCode,Toast.LENGTH_SHORT).show();
}
//重写onFailure
@Override
public void onFailure(int statusCode, Header[] headers,Throwable throwable,JSONObject erroResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
Toast.makeText(Login.this,"网络出错了"+statusCode,Toast.LENGTH_SHORT).show();
}
});
}
每次请求都需要传递一个实现ResponseHandlerInterface接口的实例,用来接收处理回调的事件,一般都继承AsyncHttpResponseHandler
1. AsyncHttpResponseHandler:
RequestParams params = new RequestParams();
TestHttpClient.get(AsyncHttpActivity.this, url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
返回结果是byte类型的,可以转换成我们需要的格式。默认重写了onSuccess和onFailure两个方法,还可以重写onStart、onFinish、onCancle、onRetry等方法来实现数据的获取以及与界面的交互效果
2. BinaryHttpResponseHandler
继承AsyncHttpResponseHandler,可以发送二进制请求,如请求图片等,也是返回byte类型。
3. TextHttpResponseHandler
继承AsyncHttpResponseHandler,返回String类型。只重写了onSuccess和onFailure两个方法。
4. JsonHttpResponseHandler
继承TextHttpResponseHandler,只重写了onSuccess和onFailure两个方法。根据返回结果(JSONObject、JSONArray和String类型),调用不同的方法。
RequestParams params = new RequestParams();
TestHttpClient.get(AsyncHttpActivity.this, url, params, new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
}
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
super.onSuccess(statusCode, headers, response);
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
super.onSuccess(statusCode, headers, responseString);
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
super.onFailure(statusCode, headers, responseString, throwable);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
}
});
5. BaseJsonHttpResponseHandler
继承自TextHttpResponseHandler,同样只重写了onSuccess、onFailure两个方法,另外添加了一个方法parseResponse。在AsyncHttpResponseHandler中onSuccess和onFailure通过handler消息机制的处理,可以直接在方法体中操作UI更新,但是在parseResponse方法中是不可以直接操作UI更新的。
RequestParams params = new RequestParams();
TestHttpClient.get(AsyncHttpActivity.this, url, params, new BaseJsonHttpResponseHandler<Object>() {
@Override
public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, Object response) {
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, Object errorResponse) {
}
@Override
protected Object parseResponse(String rawJsonData, boolean isFailure) throws Throwable {
return null;
}
});
6. FileAsyncHttpResponseHandler,可以将response写入保存到文件中:
RequestParams params = new RequestParams();
TestHttpClient.get(AsyncHttpActivity.this, url, params, new FileAsyncHttpResponseHandler(AsyncHttpActivity.this) {
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, File file) {
}
});
7. SaxAsyncHttpResponseHandler
继承自AsyncHttpResponseHandler,可以进行SAX解析。
这个框架还有许多功能,如Cookie持久化存储等,但是本人没有使用到,所以不做介绍。有兴趣可到官方文档中阅读。以上是本人在小项目中的一些使用经验,还有很多不足之处,还望指点。