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

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

  • 相关阅读:
    开采镍矿与冶炼加工镍的上市公司一览(转载)
    2010年螺纹期货基本走势分析(个人分析原创文章)
    从松柏那转载的ajax类
    推荐30个可以养站的博客(转载)
    年报掘金:机构增仓路线图曝光(20100306转载)
    一个人过习惯了,两个人不知道怎么过。。。
    各大搜索引擎的网站登录入口(转载)
    志向
    主力做庄骗术
    网上发现襄阳市场,说是正品,初步推断举步维艰
  • 原文地址:https://www.cnblogs.com/spec-dog/p/3821417.html
Copyright © 2020-2023  润新知