【发布时间】:2016-12-06 01:08:44
【问题描述】:
在我的 android 应用程序中,我使用的是 Retrofit 2 和捆绑的 okhttp。 我正在使用以下代码来设置缓存
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
File httpCacheDirectory = new File(MyApplication.getInstance().getCacheDir(), "responses");
Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
httpBuilder.cache(cache);
OkHttpClient httpClient = httpBuilder.build();
Retrofit.Builder builder = new Retrofit.Builder().
baseUrl(ApplicationConstants.BASE_API_URL).
client(httpClient).
addConverterFactory(GsonConverterFactory.create(gson));
缓存标头正在服务器端的响应中设置。它会很好地缓存文件并从缓存中显示它们,直到缓存的文件过期。
问题是当缓存过期时,它不能再被缓存。这不再缓存或替换旧的缓存文件。我认为它应该自动清理旧的无效缓存文件并替换为新的响应并缓存它。
如何清除无效响应并缓存新的有效响应。
我已经尝试了快两天了,没有解决方案。事实上,对我来说,我似乎正在按照文档做所有事情。是否还有其他可能出错的地方。
这是我来自 okhttp 的回复日志
D/OkHttp: Connection: keep-alive
D/OkHttp: Content-Type: application/json; charset=utf-8
D/OkHttp: Vary: Accept-Encoding
D/OkHttp: Transfer-Encoding: chunked
D/OkHttp: Server: Cowboy
D/OkHttp: X-Frame-Options: SAMEORIGIN
D/OkHttp: X-Xss-Protection: 1; mode=block
D/OkHttp: X-Content-Type-Options: nosniff
D/OkHttp: Date: Tue, 02 Aug 2016 17:39:23 GMT
D/OkHttp: X-Pagination: {"total":34,"total_pages":2,"first_page":true,"last_page":false,"prev_page":null,"next_page":2,"out_of_range":false}
D/OkHttp: Cache-Control: max-age=10800, public, no-transform
D/OkHttp: Etag: W/"4dcf69c9456102fd57666a1dff0eec3a"
D/OkHttp: X-Request-Id: 1fb917ac-7f77-4c99-8a3b-20d56af9d441
D/OkHttp: X-Runtime: 0.081711
D/OkHttp: Via: 1.1 vegur
我的 json 响应缓存标头如下:
提前致谢,
【问题讨论】:
-
@JesseWilson 你提到的测试文件通过了。但在真实设备上,我的应用程序仍然存在此问题。改造 1.9 和 okhttp3 运行良好。
-
@JesseWilson 我也添加了响应日志。你能帮忙解决这个问题吗?
-
尝试使用您的调试器并单步执行缓存代码。
-
@JesseWilson 我浏览了缓存目录中的 shell 和 cd。它也创建了
.0 和 .1 文件,其中一个是可读的并且具有标题,而另一个则完全是胡言乱语。并且日志文件有条目一个被标记为干净,另一个被标记为脏。
标签: android caching retrofit okhttp okhttp3