2014-03-29 31 views
1

在我的應用程序的onCreate,我創建一個10MB緩存:緩存與OkHttp(不含改裝)

try 
{ 
    File httpCacheDir = new File(getApplicationContext().getCacheDir(), Constants.AppName); 
    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB 
    HttpResponseCache.install(httpCacheDir, httpCacheSize); 
} 
catch (IOException ex) 
{ 
    Log.i(Constants.AppName, "HTTP response cache installation failed: " + ex); 
} 

而我給資源調用:

OkHttpClient client = new OkHttpClient(); 
client.setResponseCache(HttpResponseCache.getInstalled()); 

HttpURLConnection connection = client.open(url); 
connection.addRequestProperty("Cache-Control", "max-age=60"); 
InputStream inputStream = connection.getInputStream(); 

我會初始化這個調用兩次,在10秒鐘之內,OkHttp-Response-Source標題總是NETWORK 200.

for (Map.Entry<String, List<String>> k : connection.getHeaderFields().entrySet()) 
{ 
    for (String v : k.getValue()) 
    { 
     Log.d(Constants.AppName, k.getKey() + ": " + v); 
    } 
} 

我在想什麼在這裏?

回答

5

OkHttp執行HTTP 1.1 RFC for HTTP cache。這意味着,你正在試圖達成任何URL,響應需要返回至少Cache-Control頭:在HTTP

基本的緩存機制/ 1.1(服務器指定過期 倍和驗證)是隱含的指令緩存。在某些 的情況下,服務器或客戶端可能需要向HTTP緩存提供明確的指令給 。爲此,我們使用Cache-Control標頭。

Cache-Control標頭允許客戶端或服務器在請求或響應中發送各種指令。這些 指令通常會覆蓋默認的緩存算法。作爲 的一般規則,如果標題值之間存在任何明顯衝突,則應用最嚴格的解釋(即, 最可能保留語義透明度的那個)。但是,在某些情況下,緩存控制指令顯式指定爲 削弱了語義透明度的近似值(例如, 「max-stale」或「public」)。

緩存控制指令在14.9節中有詳細描述。

+0

欣賞響應。我看着我的源頭,果然,它沒有被退回。 :-( –

+2

爲了讓它工作起來,我掙扎了很多。基本上,所有的工作都必須在服務器配置中完成,以便返回正確的頭文件集。一旦我意識到這一切,就更容易了:) –

+0

對我而言不幸的是,我不控制服務器。謝謝你的幫助。 –