AsyncHttpClient 实战总结及思考
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AsyncHttpClient 实战总结及思考相关的知识,希望对你有一定的参考价值。
第一次参加工作时使用的网络框架是AsyncHttpClient,虽说该框架使用非常简洁,但是使用的过程同时也是初学者成长与思考的过程。在项目的不同阶段,重新查阅网络请求的代码,总能想到一些优化的方法,或大或小。
github:https://github.com/loopj/android-async-http
官网:http://loopj.com/android-async-http/
使用步骤:
1、创建一个AsyncHttpClient对象
2、创建RequestParams对象并设置请求参数(可选)
3、调用AsyncHttpClient的get或post方法,并传入AsyncHttpResponseHandler接口的实现对象,用于处理请求返回。一般匿名内部类即可。
使用方法:
compile ‘com.loopj.android:android-async-http:1.4.9‘
自2015年更新1.4.9版本,支持android6.0移除HttpClient带来的问题后便没有后续更新,现在更火的是OkHttp。
关键类
AsyncHttpResponseHandler:其余三个的基类,返回子节数组,实现ResponseHandlerInterface
TextHttpResponseHandler:返回字符串
JsonHttpResponseHandler:返回JSONObject或JSONArray或String
BaseJsonHttpResponseHandler:返回传入的实体类对象
创建一个AsyncHttpClient对象
AsyncHttpClient asyncHttpClient = newAsyncHttpClient();
AsyncHttpResponseHandler
asyncHttpClient.post(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { } });
通常重写onSuccess和onFailure分别对应成功、失败的处理代码。也可以重写onStart和onFinish处理启动和结束的逻辑,一般我用来显示和隐藏加载对话框
TextHttpResponseHandler
一开始不知道有这么一个类,每次都手动将byte[]转String,这个比较常用。
asyncHttpClient.get(url, newTextHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, String responseString) { } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { } });
JsonHttpResponseHandler
用于直接返回Json对象,这个类相比其他几个稍微复杂,首先需要你自己选择重写的父类方法,其次提供了三种重载的方法供你重写。
onSuccess/onFailure(...JSONArray)
onSuccess/onFailure(...JSONObject)
onSuccess/onFailure(...String)
查阅源码可知:JsonHRH会根据不同的解析结果调用不同的onSuccess/onFailure。所以使用这个类,你只需要知道服务器返回的数据格式,并重写合适的onSuccess/onFailure即可。
asyncHttpClient.get(url, new JsonHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, JSONArray response) { } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { } @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { } @Override public void onSuccess(int statusCode, Header[] headers, String responseString) { } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { } @Override public void onRetry(int retryNo) { } });
备注:这里返回的是 JSONObject或JSONArray对象,对于需要转换成Java对象的需求来说,这里还需要自己做一个转换Java对象的操作。这里不太方便,不如直接使用BaseJSONHttpResponseHandler。
BaseJsonHttpResponseHandler<JSON_TYPE>
BaseJSONHttpResponseHandler是一个泛型类,类型参数是你要反序列化的JavaBean。也是用于直接返回Json对象,不同于JsonHRH的是你需要重写parseResponse方法,自己完成Json的反序列化。方便你使用Gson、Jackson Json等第三方框架。
asyncHttpClient.get(url, new BaseJsonHttpResponseHandler<Update>() { @Override public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, Update response) { } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, Update errorResponse) { } @Override protected Update parseResponse(String rawJsonData, boolean isFailure) throws Throwable { return Update.parse(rawJsonData);//自己完成反序列化 } });
这里的Update是一个实体类,自带一个parse方法能将String反序列化程Update对象。在parseResponse中返回解析完成的Java对象,然后在onSuccess中就可以获得对应的Java对象。个人认为比JsonHRH来得好用,这里将Json转换Java对象的逻辑放在parseResponse方法里,代码逻辑更清晰。
在实战中进步:
在请求服务器,解析Json数据这条路上经历了这三个阶段:
阶段一:只使用AsyncHttpResponseHandler
每次都手动将byte[]转String,然后新增一个类JsonUtil用于将String转换成Java对象,代码非常的臃肿。
阶段二:使用TextHttpResponseHandler
省去了byte[]转String的过程。但是依然需要JsonUtil来转换Java对象
阶段三:使用BaseJsonHttpResponseHandler。
将转换过程放在每一个JavaBean类中。代码可以更简洁易懂。
同样对于json解析,以前的做法是:
1、新增一个JavaBean
2、在JsonUtil中新增一个getJavaBean()的方法用于反序列化(使用Gson)
由于Gson在使用过程中使用泛型遇到“类型擦除”的问题,找不到解决方法。对于每一个JavaBean都需要新增一个getJavaBean的方法来解析出对应的JavaBean,显得代码很臃肿。
解决方法:
方法1、在每一个JavaBean中增加一个parse的方法用于解析Json,解析方法与实体类绑定。
方法2、使用BaseJsonHttpResponseHandler,将解析过程与业务逻辑分离。
在新手阶段,对于网络上推荐的第三方框架,遵循拿来就用的原则,并没有进行过多的学习。这样使用效果非常差,对于实现原理的不理解,没有阅读过源代码,使用起来也是流于形式。多多了解其实现原理,才能够得心应手。
本文出自 “一剑围城” 博客,请务必保留此出处http://weijiancheng.blog.51cto.com/10190955/1917680
以上是关于AsyncHttpClient 实战总结及思考的主要内容,如果未能解决你的问题,请参考以下文章
Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)
实战Practice丨拉动DevOps持续交付的三匹马 —— 快速交付实践总结与思考
AsyncHttpClient 登录 Application Fragment 回调 监听 软键盘
R语言ggplot2可视化对图形进行纹理填充实战及启示:遇到问题首先去思考有没有现成的包(ggpattern)可以去解决这个问题