[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     }

 

不早了,今天先到这。明天继续。

 

 

posted @ 2014-07-02 23:52  【雨歌】  阅读(1299)  评论(0编辑  收藏  举报