[Android]Volley源码分析(二)
上一篇介绍了Volley的使用,主要接触了Request与RequestQueue这两个类,这篇就来了解一下这两个类的具体实现。
Request类图:
Request类: Request是一个抽象类,其中的主要属性:
mMethod: 请求方法,目前支持GET, POST, PUT, DELETE, HEAD, OPTIONS,TRACE, PATCH方法
mUrl: 请求Url
mErrorListener: 错误处理监听器,请求出错时调用
mSequence: 请求的序号,相同优先级的请求在请求队列中根据序号来进行排序,序号低的排在队列前面。
mRequestQueue: 该请求所在的请求队列
mCacheEntry: When a request can be retrieved from cache but must be refreshed from the network, the cache entry will be stored here so that in the event of a "Not Modified" response, we can be sure it hasn't been evicted from cache.
mRetryPolicy: 请求的重试策略
mShouldCache: 该请求的响应是否被缓存
mCanceled: 该请求是否能被取消
mResponseDelivered: 请求的响应是否已经交付。
另外还有一个mTag属性,用来标记Request,可以在RequestQueue中根据tag来批量取消Request。
主要方法包括:
getBody(): 返回请求体的字节数组表示。默认实现为返回null,所以如果是POST或PUT请求,子类需要重写这个方法。
parseNetworkResponse() 与deliverResponse()为抽象方法,由子类实现。parseNetworkResponse用来解析原始的响应信息,并返回一个特定的响应类型即Response<T>中的T类型结果。deliverResponse用来将解析好的响应结果交付给监听器进行处理。
默认情况下,Request的Priority都是Normal,如下源码:
1 /** 2 * Priority values. Requests will be processed from higher priorities to 3 * lower priorities, in FIFO order. 4 */ 5 public enum Priority { 6 LOW, 7 NORMAL, 8 HIGH, 9 IMMEDIATE 10 } 11 12 /** 13 * Returns the {@link Priority} of this request; {@link Priority#NORMAL} by default. 14 */ 15 public Priority getPriority() { 16 return Priority.NORMAL; 17 }
Request实现Comparable接口来对Request的优先级进行比较,从而决定Request在队列中的顺序。优先级越高,在请求队列中排得越前,相同优先级的序号越低,排得越前。
1 /** 2 * Our comparator sorts from high to low priority, and secondarily by 3 * sequence number to provide FIFO ordering. 4 */ 5 @Override 6 public int compareTo(Request<T> other) { 7 Priority left = this.getPriority(); 8 Priority right = other.getPriority(); 9 10 // High-priority requests are "lesser" so they are sorted to the front. 11 // Equal priorities are sorted by sequence number to provide FIFO ordering. 12 return left == right ? 13 this.mSequence - other.mSequence : 14 right.ordinal() - left.ordinal(); 15 }
Request派生出三个子类JsonRequest、ImageRequest、ClearCacheRequest。其中
1. JsonRequest<T>也是一个抽象类,可以发送一个Json表示的请求体,并返回一个T类型的响应,主要包括
mListener: 请求成功的监听器
mRequestBody:请求体的Json字符串表示。
parseNetworkResponse()仍为抽象方法,getBody()返回mRequestBody的字节数组。deliverResponse中调用mListener的onResponse方法,该方法由用户自己定义。参考上篇。
1 @Override 2 protected void deliverResponse(T response) { 3 mListener.onResponse(response); 4 }
JsonArrayRequest、JsonObjectRequest继承自JsonRequest,分别表示返回一个JsonArray响应的请求与返回一个JsonObject响应的请求。JsonArrayRequest的parseNetworkResponse实现,JsonObjectRequest与之类似,不同的是返回JSONObject类型的响应,而不是JSONArray
1 @Override 2 protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) { 3 try { 4 String jsonString = 5 new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 6 return Response.success(new JSONArray(jsonString), 7 HttpHeaderParser.parseCacheHeaders(response)); 8 } catch (UnsupportedEncodingException e) { 9 return Response.error(new ParseError(e)); 10 } catch (JSONException je) { 11 return Response.error(new ParseError(je)); 12 } 13 }
2. ImageRequest 用来根据一个URL来请求一个位图Bitmap,包括属性
mListene:用来接收经过解码的位图的监听器
mMaxWidth: 解码位图的最大宽度,
mMaxHeight:解码位图的最大高度
如果mMaxWidth,mMaxHeight都为0,则保持位图的原始尺寸,如果其中一个不为0,则按照原始位图的宽高比进行解码,如果都不为0, 则将解码成最适合width x height区域并且保持原始位图宽高比的位图。
ImageRequest的优先级是最低的。
1 @Override 2 public Priority getPriority() { 3 return Priority.LOW; 4 }
3. ClearCacheRequest 一个模拟的用来清理缓存的请求
mCache:需要清理的缓存
mCallback:缓存清理完后在主线程中被调用的回调接口。
parseNetworkResponse与deliverResponse都是空实现,因为这是一个模拟的Request,没有实际的网络请求。
ClearCacheRequest的优先级是最高的。
1 @Override 2 public Priority getPriority() { 3 return Priority.IMMEDIATE; 4 }
不早了,今天先到这。明天继续。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?