1

アプリケーション onCreate で、10MB のキャッシュを作成しています。

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 秒以内に 2 回初期化します。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);
    }
}

ここで何が欠けていますか?

4

1 に答える 1

5

OkHttp は、HTTP キャッシュ用の HTTP 1.1 RFC を実装します。つまり、到達しようとしているすべての URL に対して、応答は少なくともCache-Controlヘッダーを返す必要があります。

HTTP/1.1 の基本的なキャッシュ メカニズム (サーバー指定の有効期限とバリデータ) は、キャッシュに対する暗黙的な指示です。場合によっては、サーバーまたはクライアントが明示的なディレクティブを HTTP キャッシュに提供する必要がある場合があります。この目的のために、Cache-Control ヘッダーを使用します。

Cache-Control ヘッダーにより、クライアントまたはサーバーは、要求または応答のいずれかでさまざまなディレクティブを送信できます。これらのディレクティブは通常、デフォルトのキャッシュ アルゴリズムをオーバーライドします。原則として、ヘッダー値間に明らかな競合がある場合、最も制限的な解釈 (つまり、意味の透過性を維持する可能性が最も高い解釈) が適用されます。でも、

場合によっては、キャッシュ制御ディレクティブがセマンティック透過性の近似を弱めるものとして明示的に指定されます (たとえば、「max-stale」または「public」)。

キャッシュ制御ディレクティブについては、セクション 14.9 で詳しく説明します。

于 2014-03-29T19:12:07.707 に答える