Volley源码学习笔记

xiaoxiao2021-02-28  89

现在看一下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)); } }

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

转载请注明原文地址: https://www.6miu.com/read-83977.html

最新回复(0)