【问题标题】:Caching with OkHttp (without Retrofit)使用 OkHttp 进行缓存(无需改造)
【发布时间】:2023-03-27 20:14:02
【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

    标签: android okhttp


    【解决方案1】:

    OkHttp 实现HTTP 1.1 RFC for HTTP cache。这意味着,对于您尝试访问的任何 URL,响应至少需要返回 Cache-Control 标头:

    HTTP/1.1 中的基本缓存机制(服务器指定的过期时间) 时间和验证器)是缓存的隐式指令。在一些 在这种情况下,服务器或客户端可能需要提供明确的指令以 HTTP 缓存。为此,我们使用 Cache-Control 标头。

    Cache-Control 标头允许客户端或服务器传输 请求或响应中的各种指令。这些 指令通常会覆盖默认缓存算法。作为一个 一般规则,如果标头值之间存在任何明显的冲突, 应用了最严格的解释(即, 最有可能保持语义透明度)。然而,

    在某些情况下,缓存控制指令被明确指定为 削弱语义透明度的近似(例如, “最大陈旧”或“公共”)。

    缓存控制指令在第 14.9 节中有详细描述。

    【讨论】:

    • 感谢您的回复。我查看了我的来源,果然,它没有被退回。 :-(
    • 我也付出了很多努力才能让它发挥作用。基本上,所有工作都必须在服务器配置中完成,以返回正确的标头集。一旦我意识到这一点,一切就变得容易了:)
    • 不幸的是,我不控制服务器。感谢您的帮助。
    • 从 OKHttp 2.2.0 开始,您可以使用 networkInterceptors() 将 Cache-Control 标头添加到响应中,以防 API 响应标头配置不正确(或者更可能只是针对 Web)
    猜你喜欢
    • 2017-02-03
    • 2015-09-28
    • 2019-03-25
    • 2015-06-01
    • 1970-01-01
    • 2017-12-29
    • 2015-05-21
    • 2014-06-19
    相关资源
    最近更新 更多