Volley跟Async-http的封装
2015/10/29 15:31:44
Volley的基础
compile 'com.mcxiaoke.volley:library:1.0.19'
- Volley有get 、post等方式请求数据。
- Volley可以建立、取消请求队列。
- 把请求加入请求队列即可完成请求。
作用:
- 封装网络请求类,使请求代码量减少。
- 大大提高性能(反正很厉害就对了)。
使用示例:
1. RequestQueue queue = Volley.newRequestQueue(context)//创建一个队列
2. StringRequest jr = new StringRequest(请求方式get/post,请求url,成功监听器,失败监听器)//创建一种请求方式
3. queue.add(jr);//加入到队列
请求类型:
- JsonRequest
- StringRequest
- ImageRequest
- JsonArrayRequest
- JsonObjectRequest
- ClearCacheRequest
2015/10/29 15:34:00
Async-Http的基础
compile 'com.loopj.android:android-async-http:1.4.8'
- Async-http有get、post等方式请求数据。
- 直接通过AsyncHttpClient对象调用get、post即可完成请求。
作用:
- 封装网络请求,使请求代码量减少。
- 可以用于上传文件、下载文件。
使用示例:
1. AsyncHttpClient client = new AsyncHttpClient();
2. client.post(url,一个回调函数);
2015/10/29 15:59:01
Volley跟Async-http的封装对比
先看Async-http的封装
优点:
- 封装简单
- 不用自己写请求类
缺点:
- 没有解决同一个页面多种请求的问题
//封装请求类
public class HttpRequestUtils {
private static AsyncHttpClient client = new AsyncHttpClient();
public static void httpGet(String url, HttpCallBack callBack) {
client.get(url, callBack);
}
public static void httpPost(String url, RequestParams params, HttpCallBack callBack) {
client.post(url, params, callBack);
}
}
//由于请求服务器后,要对返回的数据进行处理,所以要定义两个抽象方法,否则 就会默认执行下述重写的方法onSucess
Http业务的回调接口
public abstract class HttpCallBack extends AsyncHttpResponseHandler {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
onRequestSuccess(responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
onRequestFailure(error);
}
public abstract void onRequestSuccess(String result);//定义两个抽象函数
public abstract void onRequestFailure(Throwable error);
}
下面是Volley的封装
优点:
- 可以解决同一页面多种请求
缺点:
- 需要自己写请求类
//Http业务的回调接口
public interface HttpCallBack {
public abstract void onSuccess(String result, long flag);
public abstract void onFailure(String error, long flag);
}
//封装请求工具类
public class HttpReqUtils {
private static HttpReqUtils httpReqUtils;
private static RequestQueue queue;
private AtomicLong mHttpCount = new AtomicLong(0); //用于实现同一页面多种请求的标识
//单例模式工具初始化
public static HttpReqUtils getInstance(Context context) {
if (httpReqUtils == null) {
httpReqUtils = new HttpReqUtils();
queue = Volley.newRequestQueue(context);
}
return httpReqUtils;
}
public long asyncPost(String url, final HttpCallBack httpCallBack) {
final long flag = mHttpCount.incrementAndGet(); //每次请求一次业务,该标识就自增1,该返回标识用于判断是哪个业务做的请求
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
httpCallBack.onSuccess(response, flag);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String errorMsg = error.getMessage();
httpCallBack.onFailure(errorMsg, flag);
}
});
queue.add(stringRequest);
return flag;
}
}
综合上述:
- 应该封装Volley而不是Async-http
- Async-http应该用于封装文件上传、下载
2016/1/21 10:05:11
如何修改已封装好的请求函数
背景:
调用第三方的请求函数,需要调用其回调函数。我想用自己定义的回调函数,该怎么办?
public static long onGetTodayMoviesMsg(Context context, int cityid, DataCallBack callBack) {
Parameters params = new Parameters();
params.add("cityid", cityid);
JuheData.executeWithAPI(context, 42, TODAY_MOVIE_MSG, JuheData.GET, params, callBack);
return flag;
}
// 第三方的回调函数是DataCallBack,自定义的HttpCallBack
思路:
自定义一个请求函数,传入自定义的Callback参数。
public static void CustomExecuteWithApi(Context context, int did, String uri, String method, Parameters params, final HttpCallBack mCallback) { DataCallback callback = null; JuheData.executeWithAPI(context, did, uri, method, params, callBack); }
创建第三方Callback的对象,重新其方法。
public static void CustomExecuteWithApi(Context context, int did, String uri, String method, Parameters params, final HttpCallBack mCallback) {
DataCallBack callBack = new DataCallBack() {
@Override
public void onSuccess(int i, String s) {
//此处调用自定义callback的函数
mCallback.onSuccess(s, FLAG_GET_CITY_MSG);
}
@Override
public void onFinish() {
}
@Override
public void onFailure(int i, String s, Throwable throwable) {
//此处调用自定义callback的函数
mCallback.onFailure(s, FLAG_GET_CITY_MSG);
}
};
JuheData.executeWithAPI(context, did, uri, method, params, callBack);
}
总结:
- 对第三方请求方法再次封装。
2016/1/21 11:00:44
请求Flag的理解
背景:
由于一个界面可能会请求多条协议,所以要区分是哪条协议返回的结果,就必须要一个标识来判断。
实现:
- 请求协议返回的标识跟实现接口返回的标识是一致的。
- 可以利用递增函数实现,每个数字代表一个协议。
private static AtomicLong atomicLong = new AtomicLong(0); //初始化从0开始递增