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 秒内初始化此调用两次,并且 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 回答