AsyncHttpClient 实战总结及思考

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AsyncHttpClient 实战总结及思考相关的知识,希望对你有一定的参考价值。

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

 

githubhttps://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)可以去解决这个问题

tornado关于AsyncHTTPClient的使用笔记

android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件