Android排球 - 覆盖JSON请求的缓存超时

时间:2013-07-09 06:33:38

标签: android android-volley

我正在尝试缓存来自服务器的JSON请求,但是,他们错误地使用了Cache-Control标头,其中包括(过去一切都过期)。我想覆盖它,以便调用缓存3个小时,无论服务器请求什么。那可能吗? Volley的文档是稀缺的。

1 个答案:

答案 0 :(得分:12)

您可以继承JsonObjectRequest类并覆盖parseNetworkResponse。你会注意到对HttpHeaderParser.parseCacheHeaders的调用 - 这是一个很好的起点:]只需包装这个调用或替换它,并将自己的虚拟Cache头配置对象[与你的专有客户端缓存时间]一起提供给Response.success。

在我的实现中它看起来像这样:

<强> parseNetworkResponse

return Response.success(payload, enforceClientCaching(HttpHeaderParser.parseCacheHeaders(response), response));

enforceClientCaching 相关成员

protected static final int defaultClientCacheExpiry = 1000 * 60 * 60; // milliseconds; = 1 hour

protected Cache.Entry enforceClientCaching(Cache.Entry entry, NetworkResponse response) {
    if (getClientCacheExpiry() == null) return entry;

    long now = System.currentTimeMillis();

    if (entry == null) {
        entry = new Cache.Entry();
        entry.data = response.data;
        entry.etag = response.headers.get("ETag");
        entry.softTtl = now + getClientCacheExpiry();
        entry.ttl = entry.softTtl;
        entry.serverDate = now;
        entry.responseHeaders = response.headers;
    } else if (entry.isExpired()) {
        entry.softTtl = now + getClientCacheExpiry();
        entry.ttl = entry.softTtl;
    }

    return entry;
}

protected Integer getClientCacheExpiry() {
    return defaultClientCacheExpiry;
}

处理2个案例:

  • 未设置缓存标头
  • 服务器缓存条目表示已过期的项目

因此,如果服务器开始发送正确的缓存标头,并且将来有效,它仍然有效。