为什么Volley中的RequestQueue中有mWaitingRequests

时间:2016-04-01 03:36:57

标签: android asynchronous android-volley

我知道 mWaitingRequest 会保留具有相同 cacheKey 的请求,当请求完成时,具有相同 cacheKey 的请求将会添加到 mCacheQueue

但我认为这不是必需的,为什么不直接将具有相同cacheKey的请求添加到mCacheQueue?

我只是搜索谷歌,但没有得到答案。

2 个答案:

答案 0 :(得分:1)

因为那时他们没有缓存,所有人都会去网络队,你不想要那个

答案 1 :(得分:0)

  

具有相同cacheKey的请求将添加到mCacheQueue

仅在必须缓存请求时才添加请求,请再次查看source code

<T> void finish(Request<T> request) {
        ...

        if (request.shouldCache()) {
            synchronized (mWaitingRequests) {
                String cacheKey = request.getCacheKey();
                Queue<Request<?>> waitingRequests = mWaitingRequests.remove(cacheKey);
                if (waitingRequests != null) {
                    if (VolleyLog.DEBUG) {
                        VolleyLog.v("Releasing %d waiting requests for cacheKey=%s.",
                                waitingRequests.size(), cacheKey);
                    }
                    // Process all queued up requests. They won't be considered as in flight, but
                    // that's not a problem as the cache has been primed by 'request'.
                    mCacheQueue.addAll(waitingRequests);
                }
            }
        }
    }
  

为什么不将具有相同cacheKey的请求添加到mCacheQueue   直接?

首先,您应该注意服务器确定缓存策略,例如,服务器可能不允许您缓存数据并将http header的缓存字段设置为:

cache-control: private, max-age=0, no-cache

这意味着对同一URL的每个新请求都可以有不同的响应,可以有新的响应,这意味着服务器响应可以随时更改,不得缓存。现在,如果用户想要缓存响应并且已经发出多个请求,则每个请求都可能有新的响应,因此为了简单起见,如果用户想要缓存数据,则每个请求都必须发送到NetworkDispatcher