个人网站备案转企业备案,胶州网站优化,餐饮网络营销方案,导航类网站模板上一篇中我们介绍了OkHttp3.0框架的基本使用方法#xff0c;这一篇我们学习一下Android的另外一个网络请求框架——AsyncHttpClient框架。Asynchttpclient框架是一个开源的异步网络请求框架#xff0c;所有的网络都在Android的非UI线程中#xff0c;通过回调方法处理请求结果…上一篇中我们介绍了OkHttp3.0框架的基本使用方法这一篇我们学习一下Android的另外一个网络请求框架——AsyncHttpClient框架。Asynchttpclient框架是一个开源的异步网络请求框架所有的网络都在Android的非UI线程中通过回调方法处理请求结果无论是向网络请求数据还是上传数据都非常方便而且这个框架非常体积非常小只有90K左右的大小我们可以轻松使用它下面我们介绍一下这个框架概述Asynchttpclient框架有如下的特征处理异步Http请求并通过匿名内部类处理回调结果Http异步请求均位于非UI线程不会阻塞UI操作通过线程池处理并发请求处理文件上传、下载,响应结果自动打包JSON格式自动处理连接断开时请求重连永久的cookie保存内部实现用的是Android的SharedPreferences通过BaseJsonHttpResponseHandler和各种json库集成支持SAX解析器支持各种语言和content编码不仅仅是UTF-8自动的gzip响应解码内置多种形式的响应解析有原生的字节流stringjson对象甚至可以将response写到文件中这里只是简单的介绍一下具体需要实现细节需要我们在开发中实际去体会。我们来学习一下Asynchttpclient里面的具体的类AsyncHttpRequest类继承自Runnabler被submit至线程池执行网络请求并发送startsuccess等消息AsyncHttpResponseHandler类接收请求结果一般重写onSuccess及onFailure接收请求成功或失败的消息还有onStartonFinish等消息TextHttpResponseHandler类继承自AsyncHttpResponseHandler只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法将请求结果由byte数组转换为StringJsonHttpResponseHandler类继承自TextHttpResponseHandler同样是重写onSuccess和onFailure方法将请求结果由String转换为JSONObject或JSONArrayBaseJsonHttpResponseHandler类继承自TextHttpResponseHandler是一个泛型类提供了parseResponse方法子类需要提供实现将请求结果解析成需要的类型子类可以灵活地使用解析方法可以直接原始解析使用gson等RequestParams类请求参数可以添加普通的字符串参数并可添加FileInputStream上传文件AsyncHttpClient类核心类使用HttpClient执行网络请求提供了getputpostdeletehead等请求方法使用起来很简单只需以url及RequestParams调用相应的方法即可还可以选择性地传入Context用于取消Content相关的请求同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类一般为AsyncHttpResponseHandler的子类AsyncHttpClient内部有一个线程池当使用AsyncHttpClient执行网络请求时最终都会调用sendRequest方法在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行SyncHttpClient类继承自AsyncHttpClient同步执行网络请求AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法再简单介绍一下Asynchttpclient框架的请求流程首先调用AsyncHttpClient的get或post等方法发起网络请求所有的请求都走了sendRequest在sendRequest中把请求封装为了AsyncHttpRequest并添加到线程池执行当请求被执行时(即AsyncHttpRequest的run方法)执行AsyncHttpRequest的makeRequestWithRetries方法执行实际的请求当请求失败时可以重试。并在请求开始结束成功或失败时向请求时传的ResponseHandlerInterface实例发送消息基本上使用的都是AsyncHttpResponseHandler的子类调用其onStartonSuccess等方法返回请求结果关于Asynchttpclient就简单介绍到这里下面介绍一下Asynchttpclient的具体使用使用Asynchttpclient框架的使用步骤基本是创建一个AsyncHttpClient对象通过RequestParams对象设置请求参数这个是可选择的调用AsyncHttpClient对象里面的方法实现请求或者上传数据。这里需要实现内部类回调框架自己有实现有不需要我们自己手动实现我们只需要调用即可。如果是在Android Studio中使用需要在gradle中添加compile com.loopj.android:android-async-http:1.4.9如果是Eclipse的话需要去GitHub或者官网下载相应版本的JAR吧GitHub地址在上文中有给出下面是Asynchttpclient的官网http://loopj.com/android-async-http/下面看一下具体的代码AsyncHttpClient client new AsyncHttpClient();client.get(https://www.google.com, new AsyncHttpResponseHandler() {Overridepublic void onStart() {// called before request is started}Overridepublic void onSuccess(int statusCode, Header[] headers, byte[] response) {// called when response HTTP status is 200 OK}Overridepublic void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {// called when response HTTP status is 4XX (eg. 401, 403, 404)}Overridepublic void onRetry(int retryNo) {// called when request is retried}});这里是Get请求的写法官方推荐我们使用静态的写法import com.loopj.android.http.*;public class TwitterRestClient {private static final String BASE_URL https://api.twitter.com/1/;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;}}这样方便我们使用。下面我们使用这个框架实现GET请求、POST请求、文件上传、文件下载这四个功能这里没有实现保存Cookie的功能有需要的可以扩展实现实现GET请求我们先看一下具体实现的代码AsyncHttpUtils.get(UrlUtils.REQUEST_URL UrlUtils.URL_KEY, null, new JsonHttpResponseHandler() {Overridepublic void onSuccess(int statusCode, Header[] headers, JSONObject response) {super.onSuccess(statusCode, headers, response);Log.i(TAG, getResources().getString(R.string.req_success));Log.i(TAG, );Log.i(TAG, response.toString());Log.i(TAG, );}Overridepublic void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) {super.onFailure(statusCode, headers, throwable, errorResponse);Log.i(TAG, getResources().getString(R.string.req_failed));}});这样就可以实现一个GET请求请求是在非UI线程中有请求成功的回调和请求失败的回调我们更新UI需要通过发消息或者其它方式实现不能再请求成功的回调方法里面直接更新UI。其中RequestParams是可以选择的没有请求参数可以直接设置为null。非常简单就不在做过多的介绍了。实现POST请求我们还是先看一下具体的代码RequestParams requestParams new RequestParams();requestParams.put(username, Devin);requestParams.put(password, Devin);AsyncHttpUtils.post(UrlUtils.POST_URL, requestParams, new AsyncHttpResponseHandler() {Overridepublic void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {Log.i(TAG, getResources().getString(R.string.req_success));}Overridepublic void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {Log.i(TAG, getResources().getString(R.string.req_failed));}});POST请求需要上传一些参数框架提供了设置参数的类RequestParams其中RequestParams类似于Map是键值对的形式添加请求参数有三种方式第一种就是像我上面代码一样创建一个空的RequestParams对象然后通过put方法将参数写入第二种则是创建的时候就直接添加例如RequestParams params new RequestParams(single, value);第三种是将参数写入一个Map中然后将Map赋给RequestParams例如HashMap paramMap new HashMap();paramMap.put(key, value);RequestParams params new RequestParams(paramMap);这三种方式无论哪一种都可以实现封装请求参数。实现文件上传使用Asynchttpclient实现文件上传也非常简单我们先看一下代码RequestParams requestParams new RequestParams();File file new File(/sdcard/okhttp-3.4.1.jar);try {requestParams.put(file, file);AsyncHttpUtils.post(UrlUtils.UPLOAD_URL, requestParams, new AsyncHttpResponseHandler() {Overridepublic void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {Log.i(TAG, getResources().getString(R.string.req_success));}Overridepublic void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {Log.i(TAG, getResources().getString(R.string.req_failed));}});} catch (FileNotFoundException e) {e.printStackTrace();}可以看到这里文件上传是将文件封装到RequestParams中的Asynchttpclient框架提供的封装文件到RequestParams中有三种方法分别是第一种是将文件转成流的形式封装到RequestParams中例如InputStream myInputStream blah;RequestParams params new RequestParams();params.put(secret_passwords, myInputStream, passwords.txt);第二种就是像上面的代码一样将文件直接封装到RequestParams中第三种是将文件转成二进制数组的形式例如byte[] myByteArray blah;RequestParams params new RequestParams();params.put(soundtrack, new ByteArrayInputStream(myByteArray), she-wolf.mp3);这三种方法无论哪一种都可以实现封装文件到RequestParams中然后调用AsyncHttpClient对象中的方法实现上传具体使用哪一种看个人喜欢了。实现文件下载使用Asynchttpclient框架实现文件下载也非常简单我们先看一下代码AsyncHttpUtils.download(UrlUtils.DOWNLOAD_URL, null, new FileAsyncHttpResponseHandler(getActivity()) {Overridepublic void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {Log.i(TAG, getResources().getString(R.string.req_failed));}Overridepublic void onSuccess(int statusCode, Header[] headers, File file) {Log.i(TAG, getResources().getString(R.string.req_success));}});实现文件下载回调选择的就是FileAsyncHttpResponseHandler这个Asynchttpclient框架提供的类这可以非常方便的实现文件的下载。关于Asynchttpclient框架就简单介绍到这里了还有保存Cookie这个功能没有实现不过实现也非常简单不懂得可以看一下官方的文档官网地址上文中有给出了。最后欢迎留言交流学习