Volley源码学习笔记_Request

来源:互联网 发布:有意思的书推荐 知乎 编辑:程序博客网 时间:2024/06/06 05:26

现在看一下Volley的请求Request是什么样子的。


abstract class Request<T> implements Comparable<Request<T>>{}...public int compareTo(Request<T> other) {        Priority left = this.getPriority();        Priority right = other.getPriority();        return left == right ? this.mSequence - other.mSequence : right.ordinal() - left.ordinal();    }

它是一个抽象类,实现了Comparable,按照优先级排序,优先级高的排到前面

构造函数

   @Deprecated    public Request(String url, Response.ErrorListener listener) {        this(Method.DEPRECATED_GET_OR_POST, url, listener);    }    public Request(int method, String url, Response.ErrorListener listener) {        mMethod = method;        mUrl = url;        mErrorListener = listener;        setRetryPolicy(new DefaultRetryPolicy());        mDefaultTrafficStatsTag = findDefaultTrafficStatsTag(url);    }

参数有方法,请求路径,响应错误监听,同时在构造函数中设置了重试机制,这个我们之前也看了,具体的设置操作是在BasicNetwork中实现的。还有一个findDefaultTrafficStatsTag(),这个看代码是为了获取Uri的host。

两个抽象方法

  abstract protected Response<T> parseNetworkResponse(NetworkResponse response);  abstract protected void deliverResponse(T response);

如果你准备继承request自定义一个请求,这2个方法是一定要的。从前面的几篇文章我们应该已经知道了。parseNetworkResponse是用在NetworkDispatcher中,用来解析BasicNetWork获取到的数据。deliverResponse的response是在ExecutorDelivery传递来请求成功的数据。这里还有一些其他的方法是我们会用到的。


getMethod

获取请求方法,在当前有一个接口Method,是里面的某一个常量。

   public interface Method {        int DEPRECATED_GET_OR_POST = -1;        int GET = 0;        int POST = 1;        int PUT = 2;        int DELETE = 3;        int HEAD = 4;        int OPTIONS = 5;        int TRACE = 6;        int PATCH = 7;    }

getTag

这个是开始的给request设置的tag,可以在队列中通过这个tag去取消请求。

setRetryPolicy

设置重试机制,具体实现在BasicNetWork

getHeaders

请求头信息,这里默认是返回一个Collections.emptyMap();你可以重写这个方法自己设置。

getParams

相关的参数,默认返回null,JsonObjectRequest请求的时候,这个没有用,可以直接在new JsonObjectRequest将json格式的参数传递过去。

getParamsEncoding

获取参数编码格式,默认“UTF-8”

getBodyContentType

获取ContentType,默认返回
“application/x-www-form-urlencoded; charset=” + getParamsEncoding();
这里具体的值可以去看这个ContentType参照表

getBody

获取请求体

    public byte[] getBody() throws AuthFailureError {        Map<String, String> params = getParams();        if (params != null && params.size() > 0) {            return encodeParameters(params, getParamsEncoding());        }        return null;    }....    /**     * Converts <code>params</code> into an application/x-www-form-urlencoded encoded string.     */     //解析参数,让其符合application/x-www-form-urlencoded编码    private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {        StringBuilder encodedParams = new StringBuilder();        try {            for (Map.Entry<String, String> entry : params.entrySet()) {                encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));                encodedParams.append('=');                encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));                encodedParams.append('&');            }            return encodedParams.toString().getBytes(paramsEncoding);        } catch (UnsupportedEncodingException uee) {            throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);        }    }

我们平时创建的都是StringRequest,JsonObjectRequest.这些都是Request的子类。

这里写图片描述

我们可以看一下StringRequest,它的parseNetworkResponse是如何解析获取来的数据的,不同的Request这里都是不一样的,按照自己的类型来解析,当然你可以继承一个Request用自己的方式来解析。

public class StringRequest extends Request<String> {    private final Listener<String> mListener;    public StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener) {        super(method, url, errorListener);        this.mListener = listener;    }    public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {        this(0, url, listener, errorListener);    }    protected void deliverResponse(String response) {        this.mListener.onResponse(response);    }    protected Response<String> parseNetworkResponse(NetworkResponse response) {        String parsed;        try {        //这里            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));        } catch (UnsupportedEncodingException var4) {            parsed = new String(response.data);        }//最后格式化一下        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));    }}

以上,不对的地方请指出非常感谢。

原创粉丝点击