移动端开发离不开网络请求,一个好的网络请求架构能提升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

总结:简单方便易扩展,还有其他的比如设置请求优先级,取消此条请求。。。就不一一举例