在我的应用程序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);
}
}
我在这里缺少什么?
答案 0 :(得分:5)
OkHttp实现HTTP 1.1 RFC for HTTP cache。这意味着,对于您尝试访问的任何网址,响应需要至少返回Cache-Control
标题:
HTTP / 1.1中的基本缓存机制(服务器指定的到期时间 时间和验证器)是对缓存的隐式指令。在一些 在某些情况下,服务器或客户端可能需要提供显式指令 HTTP缓存。为此,我们使用Cache-Control标头。
Cache-Control标头允许客户端或服务器传输 请求或响应中的各种指令。这些 指令通常会覆盖默认的缓存算法。作为一个 一般规则,如果标头值之间有任何明显的冲突, 应用最严格的解释(即,那个 最有可能保持语义透明度)。然而,
在某些情况下,缓存控制指令被明确指定为 削弱语义透明度的近似值(例如, “max-stale”或“public”)。
缓存控制指令在14.9节中有详细描述。