android网络框架volley学习之RequestQueue类

    通过Volley类创建了RequestQueue对象,同时在创建之后调用了它的start()方法。作为请求体存放的地方,当然有必要分析下这个类。

    分析RequestQueue类就必不可少的先得介绍一下此类中包装的四个队列:

    android网络框架volley学习之RequestQueue类_第1张图片

    这四个集合类构成了支撑RequestQueue的分类处理不同请求的基础。具体的体现在RequestQueue的add()方法。

    //向请求队列中添加请求
    public Request add(Request request) {
        
        request.setRequestQueue(this);

        //先给要操作的对象上锁   防止因多线程操作出现安全问题
        synchronized (mCurrentRequests) {

	    //向当前的请求队列添加请求
            mCurrentRequests.add(request);
        }


        //对加入队列中的请求进行一系列的设置
        request.setSequence(getSequenceNumber());
        request.addMarker("add-to-queue");

	//如果当前的请求不需要缓存则跳过本地缓存队列,直接添加到网络请求队列
        if (!request.shouldCache()) {
            mNetworkQueue.add(request);
            return request;
        }

        //给mWaitingRequests上锁 同样存在线程安全问题
        synchronized (mWaitingRequests) {

	    //调用请求的cacheKey值  实际上返回的是请求的URL地址
            String cacheKey = request.getCacheKey();

	    //判断目前等待请求队列中是否含有此请求
            if (mWaitingRequests.containsKey(cacheKey)) {
         
		//如果存在则取出map中的queue对象
                Queue<Request> stagedRequests = mWaitingRequests.get(cacheKey);

		//判断queue中是否存在request
                if (stagedRequests == null) {

		    //不存在的话 就新建一个容器
                    stagedRequests = new LinkedList<Request>();
                }

		//并将当前请求添加到队列中
                stagedRequests.add(request);

		//重新放入map对象中
                mWaitingRequests.put(cacheKey, stagedRequests);
                if (VolleyLog.DEBUG) {
                    VolleyLog.v("Request for cacheKey=%s is in flight, putting on hold.", cacheKey);
                }
            } else {

		//第一次请求时  则将请求放入 mWaitingRequests 同时添加到本地请求队列中
                mWaitingRequests.put(cacheKey, null);
                mCacheQueue.add(request);
            }
            return request;
        }
    }

   

   流程图如下:android网络框架volley学习之RequestQueue类_第2张图片


另外一个重要的方法就是start()方法

    //开启队列请求
    public void start() {
        stop();  
	//利用缓存队列、网络请求队列、缓存类以及响应转发来构造缓存调度器,并开启线程
        mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);
        mCacheDispatcher.start();

        //根据设置的网络调度器数组大小来循环建立网络调度器
        for (int i = 0; i < mDispatchers.length; i++) {

	    //利用网络请求队列、网络类、缓存类以及响应转发来构建网络调度器并赋值、开启线程
            NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,
                    mCache, mDelivery);
            mDispatchers[i] = networkDispatcher;
            networkDispatcher.start();
        }
    }

    当然RequestQueue的方法不止这两个,还有对应的构造方法、取消某个请求或者某一类请求(请求过滤器)、结束所有的请求(也就是结束请求线程类)等方法,这里就不一一分析了。

不对之处请大家指正,谢谢!

你可能感兴趣的:(框架,android,网络通信,Volley)