重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

AsyncHttpClient实战总结及思考-创新互联

第一次参加工作时使用的网络框架是AsyncHttpClient,虽说该框架使用非常简洁,但是使用的过程同时也是初学者成长与思考的过程。在项目的不同阶段,重新查阅网络请求的代码,总能想到一些优化的方法,或大或小。

创新互联是一家专注于成都做网站、网站制作与策划设计,浠水网站建设哪家好?创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:浠水等地区。浠水做网站价格咨询:18982081108

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

 BaseJSONHttpResponseHandler是一个泛型类,类型参数是你要反序列化的JavaBean。也是用于直接返回Json对象,不同于JsonHRH的是你需要重写parseResponse方法,自己完成Json的反序列化。方便你使用Gson、Jackson Json等第三方框架。

asyncHttpClient.get(url, new BaseJsonHttpResponseHandler() {
    @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,将解析过程与业务逻辑分离。

 在新手阶段,对于网络上推荐的第三方框架,遵循拿来就用的原则,并没有进行过多的学习。这样使用效果非常差,对于实现原理的不理解,没有阅读过源代码,使用起来也是流于形式。多多了解其实现原理,才能够得心应手。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前标题:AsyncHttpClient实战总结及思考-创新互联
URL地址:http://cqcxhl.com/article/dhjdec.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP