第一次参加工作时使用的网络框架是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
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,将解析过程与业务逻辑分离。
在新手阶段,对于网络上推荐的第三方框架,遵循拿来就用的原则,并没有进行过多的学习。这样使用效果非常差,对于实现原理的不理解,没有阅读过源代码,使用起来也是流于形式。多多了解其实现原理,才能够得心应手。