Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android Handler message 机制传递信息。在 iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http(官方网址:https://loopj.com/android-async-http/ ),目前非常火的应用Instagram和Pinterest的Android版就是用的这个网络请求库。这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。
其主要特征如下:
- 处理异步Http请求,并通过匿名内部类处理回调结果
- Http请求均位于非UI线程,不会阻塞UI操作
- 通过线程池处理并发请求
- 处理文件上传、下载
- 采用RequestParams类创建GET/POST参数
- 不需要第三方包即可支持Multipart file文件上传
- 大小只有25kb
- 自动为各种移动电话处理连接断开时请求重连
- 超快的自动gzip响应解码支持
- 使用BinaryHttpResponseHandler类下载二进制文件(如图片)
- 使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式
- 持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中
android-async-http实现下载
添加依赖:
dependencies {
compile 'com.loopj.android:android-async-http:1.4.9'
}
创建asyncHttpClient对象:
AsyncHttpClient <span style="font-family: Arial, Helvetica, sans-serif;">asyncHttpClient</span><span style="font-family: Arial, Helvetica, sans-serif;">= new AsyncHttpClient();</span>
调用asyncHttpClient对象的get方法:
private void asyncGetMethod() {
asyncHttpClient.get(url, new AsyncHttpResponseHandler() {//接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
// called when response HTTP status is "200 OK"
if(statusCode==200){
// Log.e("dy",new String(responseBody));
Bitmap bitmap = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length);
imageView.setImageBitmap(bitmap);//回调发生在创建它的线程中
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
});
}
记得不要忘记加上网络访问权限。
这样一个简单的网络访问请求就完成了。效果图如下:
private void asyncGetMethodWithParams() {
params = new RequestParams();
params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
params.put("company","zhongtong");
params.put("id","719235004847");
asyncHttpClient.get(url2,params,new TextHttpResponseHandler() {
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
textView.setText(responseString);
}
});
}
效果图:
TextHttpResponseHandler,其继承自AsyncHttpResponse,并将原生的字节流根据指定的encoding转化成了string对象。同样的方式,你可以发送json请求,代码如下:
private void sendJsonRequest() {
params=new RequestParams();
params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
params.put("company","zhongtong");
params.put("id","719235004847");
asyncHttpClient.get(url2,params,new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// Handle resulting parsed JSON response here
try {
Log.e("dy",response.getString("result"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
返回的response已经自动转化成JSONObject了,当然也支持JSONArray类型,override你需要的那个版本就行。android-async-http的基本用法就上面那些,另外,官方建议我们Make a Static Http Client,即写一个静态的httpClient对象,代码如下:
public class MyHttpClient {
private static final String BASE_URL="http://api.avatardata.cn";
private static AsyncHttpClient client=new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
client.get(getAbsoluteUrl(url),params,responseHandler);
}
public static void post(String url,RequestParams params,AsyncHttpResponseHandler responseHandler){
client.post(getAbsoluteUrl(url),params,responseHandler);
}
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL+relativeUrl;
}
}
private void staticHttpClient() {
params=new RequestParams();
params.put("key","ce3ed11412e24cb9ac909a54ba8fbbd1");
params.put("company","zhongtong");
params.put("id","719235004847");
MyHttpClient.get(url2,params,new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// If the response is JSONObject instead of expected JSONArray
try {
String error = response.getString("result");
textView.setText(error);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
上述源码下载:源码
android-async-http实现上传
待续。。。
主要类介绍
- AsyncHttpRequest
- AsyncHttpResponseHandler
- TextHttpResponseHandler
- JsonHttpResponseHandler
- BaseJsonHttpResponseHandler
- RequestParams
- AsyncHttpClient
- SyncHttpClient
请求流程:
- 调用AsyncHttpClient的get或post等方法发起网络请求
- 所有的请求都走了sendRequest,在sendRequest中把请求封装为了AsyncHttpRequest,并添加到线程池执行
- 当请求被执行时(即AsyncHttpRequest的run方法),执行AsyncHttpRequest的makeRequestWithRetries方法执行实际的请求,当请求失败时可以重试。并在请求开始,结束,成功或失败时向请求时传的ResponseHandlerInterface实例发送消息
- 基本上使用的都是AsyncHttpResponseHandler的子类,调用其onStart,onSuccess等方法返回请求结果
其他说明
- Android-Async-Http的使用非常简单,通过AsyncHttpClient发起请求就可以了,如果需要添加参数,直接传一个RequestParams过去,而且参数可以是String、File和InputStream,可以很方便地上传文件。
- 每个请求都需要传一个ResponseHandlerInterface的实例用以接收请求结果或请求失败,请求结束等通知,一般是AsyncHttpResponseHandler的子类。
- 通过BinaryHttpResponseHandler可以发起二进制请求,如请求图片。
- 通过TextHttpResponseHandler可以发起返回结果为字符串的请求,一般这个使用较多。
- 也可以使用它的子类JsonHttpResponseHandler,返回结果是一个JSONObject或JSONArray。不过感觉这个类作用不大,一是有另一个类BaseJsonHttpResponseHandler,可以直接解析返回的JSON数据,二是JsonHttpResponseHandler的方法太复杂了,有太多的onSuccess和onFailure方法,都不知道重写哪个了。
参考资料:
快速Android开发系列网络篇之Android-Async-Http:http://www.cnblogs.com/angeldevil/p/3729808.html
Android网络请求库android-async-http使用:http://www.open-open.com/lib/view/open1392780943038.html
Android-Async-Http英文api:https://loopj.com/android-async-http/doc/
AsyncHttpClient 源码分析:http://www.cnblogs.com/xiaoweiz/p/3918042.html