移动端开发离不开网络请求,一个好的网络请求架构能提升app的性能和用户的使用体验,今天讲讲volley的使用。volley以前是google官方推出的一个网络请求框架,现在转而被其他的框架代替了,但是对于我们开发者来说好用,方便的东西就是好东西。下面是volley的优势
- 自动网络请求调度。
- 多个并发网络连接。
- 透明磁盘和具有标准 HTTP 缓存一致性的内存响应缓存。
- 支持请求优先级。
- 取消请求 API。您可以取消单个请求,也可以设置要取消的请求的时间段或范围。
- 可轻松自定义,例如自定义重试和退避时间。
- 强大的排序功能,让您可以轻松使用从网络异步提取的数据正确填充界面。
- 调试和跟踪工具
在实际的开发过程中我们可能管不了这么多,想到网络请求我们首先想到的是下面的几点
- 请求地址 url
- 请求参数
- 异步调用
- 回调主线程
- 请求结果数据的解析
一般情况下,我们都会对请求框架进行封装,减少样板代码。下面直接进入volley的使用。
implementation 'com.android.volley:volley:1.2.1'
1.生成RequestQueue实例,全局使用,可把他设置成单例
- 默认方式
RequestQueue requestQueue = Volley.newRequestQueue(this.getApplicationContext());
- 自定义缓存方式
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap
Network network = new BasicNetwork(new HurlStack());
requestQueue = new RequestQueue(cache, network);
requestQueue.start();//可以把此requestQueue设置成单例
2.生成Request,库中给我们提供了几种类型的Request,不过我们一般根据业务进行自定义
public class MyRequest<T> extends Request<T> {
/**
* 构造方法不多说,也可自己自定义
*/
public MyRequest(int method, String url, @Nullable Response.ErrorListener errorListener) {
super(method, url, errorListener);
}
/**
* 此方法重要
* 响应请求成功的数据
* 此方法再子线程执行
*/
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
//此处回调到deliverResponse方法
return Response.success("可以看到我们有一个泛型T,此处就是把数据解析成我们想要的样子,然后会传递给下面的 deliverResponse 方法", HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
//此处回调到deliverError方法去
return Response.error(new ParseError(e));
}
}
/**
* 此方法重要
* 由上面的Response.success传递
* 此方法运行在ui线程
*/
@Override
protected void deliverResponse(T response) {
//此处可以成功回调到我们自己的监听器去了
}
/**
* 此方法处理失败的情况
* 运行在子线程
* 处理后会回调到deliverError方法去
* @return
*/
@Override
protected VolleyError parseNetworkError(VolleyError volleyError) {
return super.parseNetworkError(volleyError);
}
/**
* 此方法处理失败的逻辑
* 不同的是其运行在主线程
* 一般我们在此回调到我们自己的监听器上面去
* @param error
*/
@Override
public void deliverError(VolleyError error) {
super.deliverError(error);
//此处可以回调到我们自己的监听器的失败回调上去了
}
/**
* 请求的url可以通过构造方法传入,也可通过此方法做自己自定义的一些处理,比如拼接,动态修改
* @return
*/
@Override
public String getUrl() {
return super.getUrl();
}
/**
* 为你的请求加入自定义的请求头
* @return
* @throws AuthFailureError
*/
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return super.getHeaders();
}
/**
* 此方法重要
* post请求需要向后台发送的参数
* 此方法和下面的getBody方法根据需要重载一个即可
* @return
* @throws AuthFailureError
*/
@Nullable
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return super.getParams();
}
/**
* 默认utf-8
* @return
*/
@Override
protected String getParamsEncoding() {
return super.getParamsEncoding();
}
/**
* 默认 application/x-www-form-urlencoded; charset=utf-8
* @return
*/
@Override
public String getBodyContentType() {
return super.getBodyContentType();
}
/**
* 此方法重要
* post请求需要向后台发送的参数
* 此方法和上面的getParams方法根据需要重载一个即可,其是通过上面的getParams参数所生成
* @return
* @throws AuthFailureError
*/
@Override
public byte[] getBody() throws AuthFailureError {
return super.getBody();
}
}
3.将Request添加到RequestQueue里去
RequestQueue requestQueue = Volley.newRequestQueue(this.getApplicationContext());
MyRequest<String> request = new MyRequest<>();
requestQueue.add(request);
Volley的请求超时和读取超时时间时设置成一样的,其默认时间总共为7s,第一次2.5s,重试一次,第二次为5s,我们如果需要根据业务更改,可如下操作
request.setRetryPolicy(new DefaultRetryPolicy(2500,2,1f));//第一次超时时间为2.5s,第二次为5s,第三次为10s
总结:简单方便易扩展,还有其他的比如设置请求优先级,取消此条请求。。。就不一一举例