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)); }}
以上,不对的地方请指出非常感谢。
- Volley源码学习笔记_Request
- Volley源码学习笔记1
- Volley源码学习笔记_ExecutorDelivery
- Volley源码学习笔记_RequestQueue和BasicNetWork
- Volley源码学习笔记_CacheDispatcher和NetworkDispatcher
- 黑马程序员_学习笔记18_Request
- Volley 源码笔记(1)
- Volley 源码笔记(2)
- Volley源码笔记
- Volley源码学习
- JSP基础实例_request获得客户端参数_学习笔记
- JAVA学习笔记_request请求转发_response重定向
- Volley学习(一)Android Volley源码解析
- Volley学习笔记
- volley学习笔记
- volley学习笔记
- Volley学习笔记
- volley框架学习笔记
- 管道
- 单例模式
- Linux 帮助命令(man/help/info)
- MongoDB数据库查询方法
- django 数据库的用户名和密码错了,这样改
- Volley源码学习笔记_Request
- jmeter碰到的问题及解决方案
- 低电量自动关机时无关机动画
- 猴子吃桃问题
- 事件触发器---dispatchEvent
- HTML5 之图片上传预处理
- BZOJ4598: [Sdoi2016]模式字符串
- ubuntu使用mailx利用SMTP发送邮件
- Hadoop(HDFS、YARN、HBase、Hive和Spark等)默认端口表