使用OkHttp进行缓存(不使用Retrofit)

时间:2014-03-29 18:27:34

标签: android okhttp

在我的应用程序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);
    }
}

我在这里缺少什么?

1 个答案:

答案 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节中有详细描述。