这可能是一个非常基本的问题,但我已经没有想法了。
Retrofit v2.4.0没有发送 If-Modified-Since 标头,因此缓存无法正常工作。
我每天多次轮询服务器以查看是否有更新的数据,因此需要 If-Modified-Since 标头。 (推送通知可以在新版本中实施)
根据这篇文章,设置非常简单:https://futurestud.io/tutorials/retrofit-2-activate-response-caching-etag-last-modified
我已经阅读了几篇相关文章,但是当服务器的实现无法访问或者没有发送标题时,这些文章主要关注用例。这不是我的情况。那些建议使用networkInterceptors()
。由于发送了正确的响应头,我不需要拦截器(我猜)。
理论上它应该有用。
根据响应标头,看起来服务器配置正确。
以下是代码:
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.HEADERS);
Cache cache = new Cache(getApplication().getCacheDir(), 30 * 1024 * 1024);
httpClient = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(logging)
.build();
retrofit = new Retrofit.Builder()
.baseUrl("http://someserver:8080/")
.callbackExecutor(Executors.newSingleThreadExecutor())
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
日志:
D / OkHttp: - >获取http://someserver:8080/model/modelId http / 1.1
D / OkHttp: - >结束了
< - 200 OK http://someserver:8080/model/modelId(23ms)
D / OkHttp:Cache-Control:private
D / OkHttp:Content-Length: 3240854
D / OkHttp:Content-Type:application / octet-stream
D / OkHttp:Last-Modified:2018年5月14日星期一07:22:25 GMT
D / OkHttp:日期:星期一,2018年5月14日09:03:50 GMT
D / OkHttp:< - END HTTP
请让我知道我做错了什么。
答案 0 :(得分:2)
您的服务器缓存配置不正确。如果您查看this article's疑难解答部分,您会注意到它必须是Cache-Control: private, must-revalidate
。