我正在尝试缓存来自服务器的JSON请求,但是,他们错误地使用了Cache-Control标头,其中包括(过去一切都过期)。我想覆盖它,以便调用缓存3个小时,无论服务器请求什么。那可能吗? Volley的文档是稀缺的。
答案 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个案例:
因此,如果服务器开始发送正确的缓存标头,并且将来有效,它仍然有效。