[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 }
不早了,今天先到这。明天继续。