首页 > 代码库 > [Android]Volley源码分析(二)

[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         IMMEDIATE10     }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  @Override2     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 @Override2     public Priority getPriority() {3         return Priority.LOW;4     }

3. ClearCacheRequest 一个模拟的用来清理缓存的请求

mCache:需要清理的缓存

mCallback:缓存清理完后在主线程中被调用的回调接口。

parseNetworkResponse与deliverResponse都是空实现,因为这是一个模拟的Request,没有实际的网络请求。

ClearCacheRequest的优先级是最高的。

1 @Override2     public Priority getPriority() {3         return Priority.IMMEDIATE;4     }

 

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