2016-06-11 103 views
0

我用的是閱讀有關凌空圖書館這個link凌空請求機制

它說:「首先,排球檢查請求是否可以從緩存提供服務。如果可以的話,緩存的響應被讀取,分析,並交付使用。否則它會傳遞給網絡線程。「

所以我在這裏的問題是假設凌空擊中一些URL和網絡在下一個請求的中間然後下降如何排球瞭解它是否必須從緩存中獲取數據或它需要將請求傳遞到網絡線程?

回答

1

當你運行你的應用程序,第一次請求URL時,Volley還會檢查該URL的緩存條目是否存在。如果是,它是有效的(未過期),Volley將從緩存獲取響應。否則,它傳遞給網絡線程。獲取響應數據時,它會解析響應頭以查看數據是否可以緩存。 然後,對於同一個url的第二個請求,儘管網絡關閉或沒有,web服務是否可用,如果該url的緩存條目存在且有效,緩存數據將用於響應。

你可以發現裏面CacheDispatcher.java file

... 
final Request<?> request = mCacheQueue.take(); 
request.addMarker("cache-queue-take"); 

// If the request has been canceled, don't bother dispatching it. 
if (request.isCanceled()) { 
    request.finish("cache-discard-canceled"); 
    continue; 
} 

// Attempt to retrieve this item from cache. 
Cache.Entry entry = mCache.get(request.getCacheKey()); 
if (entry == null) { 
    request.addMarker("cache-miss"); 
    // Cache miss; send off to the network dispatcher. 
    mNetworkQueue.put(request); 
    continue; 
} 

// If it is completely expired, just send it to the network. 
if (entry.isExpired()) { 
    request.addMarker("cache-hit-expired"); 
    request.setCacheEntry(entry); 
    mNetworkQueue.put(request); 
    continue; 
} 

// We have a cache hit; parse its data for delivery back to the request. 
request.addMarker("cache-hit"); 
Response<?> response = request.parseNetworkResponse(
     new NetworkResponse(entry.data, entry.responseHeaders)); 
request.addMarker("cache-hit-parsed"); 
... 

parseCacheHeadersHttpHeaderParser.java file更多細節。

如果Web服務器不支持緩存輸出,可以實現對排球緩存爲我的答案在以下問題:

Android Setup Volley to use from Cache

希望它能幫助!