网络请求库之android-async-http

    xiaoxiao2026-06-16  7

    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) } }); } 记得不要忘记加上网络访问权限。 这样一个简单的网络访问请求就完成了。效果图如下:   callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在Service中或者后台线程中,库代码会自动识别出它所运行的context。 当然你也可以通过RequestParams来传递各种参数。

    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 继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息 AsyncHttpResponseHandler 接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息 TextHttpResponseHandler 继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法, 将请求结果由byte数组转换为String JsonHttpResponseHandler 继承自TextHttpResponseHandler,同样是重写onSuccess和onFailure方法, 将请求结果由String转换为JSONObject或JSONArray BaseJsonHttpResponseHandler 继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类需要提供实现,将请求结果解析成需要的类型,子类可以灵活地使用解析方法,可以直接原始解析,使用gson等。 RequestParams 请求参数, 可以添加普通的字符串参数,并可添加File,InputStream上传文件 AsyncHttpClient 核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。 SyncHttpClient 继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法。

    请求流程:

    调用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

    转载请注明原文地址: https://ju.6miu.com/read-1310565.html
    最新回复(0)