4
我试图缓存来自服务器的JSON请求,但是,他们错误地使用了Cache-Control头等等(过去的所有内容都过期了)。我想覆盖它,这样无论服务器请求什么,呼叫都可以缓存3个小时。那可能吗? Volley的文档是稀缺的。Android volley - 为JSON请求覆盖缓存超时
我试图缓存来自服务器的JSON请求,但是,他们错误地使用了Cache-Control头等等(过去的所有内容都过期了)。我想覆盖它,这样无论服务器请求什么,呼叫都可以缓存3个小时。那可能吗? Volley的文档是稀缺的。Android volley - 为JSON请求覆盖缓存超时
您可以继承JsonObjectRequest类并覆盖parseNetworkResponse。您会注意到对HttpHeaderParser.parseCacheHeaders的调用 - 这是一个开始的好地方:]只需包装此调用或将其替换并将您自己的虚拟缓存头配置对象[使用您的专有客户端缓存时间]提供给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;
}
它处理两种情况:
因此,如果服务器开始发送,在未来到期正确的缓存头,它仍然可以工作。
对不起,您从哪里获取Cache.Entry? – StackOverflowed
来自httpheaderparser.parsecacheheaders,如上所述 – Makibo
谢谢。所以我们不需要将服务器响应数据保存在数据库中。这是真的? –