我正在尝试缓存来自服务器的 JSON 请求,但是,它们错误地使用了 Cache-Control 标头等(过去所有内容都已过期)。我想覆盖它,以便将调用缓存 3 小时,无论服务器请求什么。那可能吗?Volley 的文档很少。
问问题
2967 次
1 回答
12
您可以继承 JsonObjectRequest 类并覆盖 parseNetworkResponse。您会注意到对 HttpHeaderParser.parseCacheHeaders 的调用 - 这是一个很好的开始:] 只需包装此调用或替换它并提供您自己的虚拟缓存标头配置对象 [带有您专有的客户端缓存时间] 到 Response.success。
在我的实现中,它看起来像这样:
解析网络响应
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;
}
它处理两种情况:
- 没有设置缓存头
- 服务器缓存条目指示过期项目
因此,如果服务器将来开始发送正确的缓存标头并过期,它仍然可以工作。
于 2013-07-09T15:55:55.983 回答