我开始使用Android中的缓存和Retrofit / OKHttp3。我们需要为我们的应用程序支持离线模式/服务器关闭,并且我试图弄清楚如何正确配置缓存以支持它。我们的想法是在服务器可用时从服务器获取新的副本(如果没有任何更改,则从304获取)。如果服务器关闭或者应用程序处于脱机状态,我们需要获取缓存的响应。
我像这样配置了Cache-control:
Cache-Control: no-transform, max-age=0, max-stale=50, private
这非常好用,但我不明白为什么OKHttp服务于缓存的响应,即使在" max-stale"已经过去了?我认为50秒后我会得到一个504 - 不满意的请求,因为最大陈旧时期已经过去了?
这是我用于OKHttp的拦截器:
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
try {
if (!NetworkUtil.isNetworkAvailable(model.getApplicationContext())) {
return getCachedResponse(chain);
}
Request request = chain.request();
return chain.proceed(request);
} catch (Exception exception) {
return getCachedResponse(chain);
}
}
})
private static Response getCachedResponse(Interceptor.Chain chain) throws IOException {
Request request = chain.request().newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.removeHeader("Pragma")
.build();
Response forceCacheResponse = chain.proceed(request);
return forceCacheResponse.newBuilder()
.build();
}
任何想法如何配置缓存,以便在最长时间段过后它不会提供缓存的响应?
答案 0 :(得分:3)
与往常一样,在您提出问题后,您会找到答案。据我所知,即使在最长时间过后,缓存仍继续提供内容,因为我使用了CacheControl.FORCE_CACHE。这会添加一个“only-if-cache”标志,并且还将max-stale设置为一个非常高的值,该值会覆盖服务器首先传递的最大过时值。我通过创建另一个具有我定义的最大陈旧值的cachecontrol来解决它:
private static Response getCachedResponse(Interceptor.Chain chain) throws IOException {
CacheControl cacheControl = new CacheControl
.Builder()
.onlyIfCached()
.maxStale(5, TimeUnit.MINUTES).build();
Request request = chain.request().newBuilder()
.cacheControl(cacheControl)
.removeHeader("Pragma")
.build();
Response forceCacheResponse = chain.proceed(request);
return forceCacheResponse.newBuilder()
.build();
}