`
f303153041
  • 浏览: 45589 次
社区版块
存档分类
最新评论

Volley 核心源码解析(二)

 
阅读更多
请求队列 RequestQueue

每一个使用过Volley的同行们都用过 RequestQueue.add(request) 这个方法,看看这个方法到底做了什么:

public <T> Request<T> add(Request<T> request) {
        // Tag the request as belonging to this queue and add it to the set of current requests.
        request.setRequestQueue(this);
        synchronized (mCurrentRequests) {
            mCurrentRequests.add(request);
        }


        // Process requests in the order they are added.
        request.setSequence(getSequenceNumber());
        request.addMarker("add-to-queue");

        // If the request is uncacheable, skip the cache queue and go straight to the network.
        if (!request.shouldCache()) {
            mNetworkQueue.add(request);
            return request;
        }


        // Insert request into stage if there's already a request with the same cache key in flight.
       synchronized (mWaitingRequests) {
            String cacheKey = request.getCacheKey();
            if (mWaitingRequests.containsKey(cacheKey)) {
                // There is already a request in flight. Queue up.
                Queue<Request<?>> stagedRequests = mWaitingRequests.get(cacheKey);
                if (stagedRequests == null) {
                    stagedRequests = new LinkedList<Request<?>>();
                }
                stagedRequests.add(request);
               mWaitingRequests.put(cacheKey, stagedRequests);
                if (VolleyLog.DEBUG) {
                    VolleyLog.v("Request for cacheKey=%s is in flight, putting on hold.", cacheKey);
                }
            } else {
                // Insert 'null' queue for this cacheKey, indicating there is now a request in
                // flight.
                mWaitingRequests.put(cacheKey, null);
                mCacheQueue.add(request);

            }
            return request;
        }
    }

我们看到  这里面有两个被用synchronized 块锁住的对象:mCurrentRequests,mWaitingRequests

那么这两个是什么呢?
    /**
     * The set of all requests currently being processed by this RequestQueue. A Request
     * will be in this set if it is waiting in any queue or currently being processed by
     * any dispatcher.
     */
    private final Set<Request<?>> mCurrentRequests = new HashSet<Request<?>>();


/**
     * Staging area for requests that already have a duplicate request in flight.
     *
     *

         *     <li>containsKey(cacheKey) indicates that there is a request in flight for the given cache
         *          key.</li>
         *     <li>get(cacheKey) returns waiting requests for the given cache key. The in flight request
         *          is not contained in that list. Is null if no requests are staged.</li>
         *

     */
    private final Map<String, Queue<Request<?>>> mWaitingRequests =
            new HashMap<String, Queue<Request<?>>>();


看英文注释意思:
mCurrentRequests 大意是,当前在这个队列里所有正在被执行的请求的集合。所有的正在被执行的 或者  在队列中等待执行的请求都应该放进这个set 集合中。

mWaitingRequests:包含重复请求的临时区域,

通俗的说就是 一个是所有正在执行和等待执行的请求集合,另一个是存放重复请求的临时区域 是一个map.




当我们调用add 方法的时候 首先是把请求 加入到 mCurrentRequests  中,当然咯,这个过程是同步的。
此时volley 还给每个请求设置了 序号 和 备注:
request.setSequence(getSequenceNumber());
request.addMarker("add-to-queue");


接下来如下:
if (!request.shouldCache()) {
            mNetworkQueue.add(request);
            return request;
        }

这段代码很有意思,如果一个请求不支持被缓存的话,马上就把这个请求交给mNetworkQueue
中去执行,后面的代码不再执行。

mNetworkQueue  的定义如下:

/** The queue of requests that are actually going out to the network. */
    private final PriorityBlockingQueue<Request<?>> mNetworkQueue =
        new PriorityBlockingQueue<Request<?>>();


这是一个全新的阻塞式的队列。这个队列的作用 后面再讲。

在Request 类中 我们看到
private boolean mShouldCache = true;
说明 Volley中默认每一个请求都是要被缓存的。

接下来 通过Request的cacheKey 区分请求是否重复,如果有重复请求,就把这个请求所属的队列拿出来,然后把新的请求加到队列中,再存到 mWaitingRequests中。
如果mWaitingRequests中没有这个请求,就用这个请求的 cacheKey 去保存一个NULL值,

言简意赅的说;每一个请求都会在执行的同时放到 mWaitingRequests中 ,同时也要被放进缓存队列中,
mCacheQueue:
private final PriorityBlockingQueue<Request<?>> mCacheQueue =
        new PriorityBlockingQueue<Request<?>>();



mCacheQueue 中的请求何时执行,后面会讲到。






下一节 Volley 的任务调度模型  http://f303153041.iteye.com/blog/2281352








0
1
分享到:
评论

相关推荐

    Volley源码解析

    Volley源码解析是理解其工作原理、优化网络请求的关键,下面我们将深入探讨Volley的核心组件、工作流程以及关键算法。 首先,Volley的核心组件包括RequestQueue、Network、Cache和ResponseDelivery。RequestQueue是...

    volley源码和jar包

    在压缩包中的"Volley.jar"是Volley库的编译结果,可以直接导入到Android项目中使用,无需解析源码。使用jar包时,开发者可以直接调用Volley提供的API,如`RequestQueue.add(Request)`来添加请求,或者使用`...

    volley框架源码实例

    这个"volley框架源码实例"包含了Volley的源代码和一些二次封装的示例,你可以通过下载并导入到你的工程中运行,以便更深入地理解和学习Volley的工作原理和用法。 首先,Volley的核心特点包括: 1. **缓存机制**:...

    google官方最新volley源码

    这个压缩包中包含的应该是Google官方发布的最新版本的Volley源码,这对于开发者深入理解Volley的工作原理、进行二次开发或者优化自己的应用网络请求性能具有非常高的价值。 Volley的核心特点包括: 1. **高效缓存*...

    android volley源码

    在深入了解Volley的源码之前,我们先来概述一下Volley的基本概念和核心功能。 Volley的主要目标是简化Android应用中的网络请求处理,提供了一套高效的网络请求管理机制,包括异步处理、缓存策略、错误处理和性能...

    volley源码

    Volley的核心设计理念是优化UI线程的性能,减少网络延迟对用户界面的影响,以及通过缓存机制提高用户体验。下面我们将深入探讨Volley的源码,了解其工作原理和主要功能。 1. **网络请求模块**: - `Request`类是...

    Volley源码

    Volley的核心特性包括: 1. **缓存策略**: - Volley提供了基于内存和磁盘的两级缓存机制,能够快速响应网络请求,减少对服务器的压力。内存缓存用于存储最近访问的数据,磁盘缓存则用于长期存储,即使应用关闭也...

    Android Volley源码20160414版

    Volley 的核心优势在于其对网络请求的优化、内存管理以及线程调度策略。 1. **RequestQueue**:这是 Volley 的主要入口点,负责管理多个 CacheDispatcher 和 NetworkDispatcher 线程,处理请求队列。RequestQueue ...

    google volley源码和jar

    在Volley的源码中,可以看到许多关键类的设计,如Request类用于封装网络请求信息,ResponseListener接口用于处理响应数据,Parser类用于解析数据等。此外,Volley还提供了强大的错误处理机制,使得开发者可以方便地...

    可查看Volley源码

    Volley的核心理念是优化内存使用,减少网络请求的延迟,以及通过缓存机制提高用户体验。这个名为"可查看Volley源码"的压缩包文件,很显然是为了帮助开发者深入理解Volley的工作原理,从而更好地利用它进行应用开发。...

    Volley源码及文档

    Volley是Google推出的一款高效的网络请求库,专为Android平台设计。...通过深入理解Volley的源码,开发者可以更好地利用其特性,提升应用的网络性能。提供的文档将帮助你理解和应用这些知识点,解决实际开发中的问题。

    Volley.jar及源码

    在"Volley.jar及源码"的资源中,我们得到了1.0.19版本的Volley库的二进制形式(volley_library-1.0.19.jar)以及源码(android-volley-master.zip)。通过分析这些内容,我们可以深入了解Volley的工作原理和使用方法...

    volley和okhttp的jar包含volley源码

    - 数据解析:Volley支持多种数据格式,如JSON、XML,可以直接转换为Java对象。 - 取消请求:可以轻松取消不再需要的请求,避免资源浪费。 2. OkHttp是Square公司开发的一个高效的HTTP客户端,其设计理念是减少...

    Volley框架源码

    Volley框架的源码分析可以帮助开发者深入理解其工作原理,从而更好地优化网络请求性能,例如调整缓存策略、定制网络栈或实现自定义的解析器。通过对源码的学习,开发者还可以解决Volley在特定场景下可能遇到的问题,...

    android网络框架Volley-源码,范例,jar包

    其次,Volley支持多种网络请求类型,如GET、POST等,并且能够自动处理JSON和其他常见格式的数据解析,简化了开发过程。 在压缩包中的"android-volley-master"目录下,包含的是Volley的源码。通过对源码的学习,...

Global site tag (gtag.js) - Google Analytics