OkHttp 设置了 Cache 未成功写入
date
Aug 12, 2021
slug
some error
status
Published
tags
问题
okhttp
summary
type
Post
使用 OkHttp 自带的缓存配置 + 自定义 Cache 信息完成缓存,OkHttp 未成功写入。
问题 Log 及相关信息
缓存的临时文件已经生成,且 header 所属文件已有相关信息,但 response 文件中没有。
问题原因
response#body#close 没有被调用。
response#body 需要手动调用,如果使用了 Retrofit,则在其内部的 OkHttpCall#parseResponse 中有 OkHttp3Response#body#close 的调用
OkHttp 相关源码
在 edit#commit 内部,会将 response#body 写入本地磁盘
Retrofit 相关源码
可能复现的场景
必现
Request request = new Request.Builder()
.url(url)
.build();
HttpConfiguration.getOkHttpClient().newCall(request)
.enqueue(new okhttp3.Callback() {
@Override
public void onFailure(@NotNull okhttp3.Call call, @NotNull IOException e) {
Log.d(TAG, "onResponse: error " + e.getMessage());
}
@Override
public void onResponse(@NotNull okhttp3.Call call, @NotNull okhttp3.Response response) throws IOException {
Log.d(TAG, "onResponse: " + response.isSuccessful() + " net " + response.networkResponse() + " cache " + response.cacheResponse());
}
});
解决方案
- 使用 OkHttp 时手动关闭 response#body
- 改用 Retrofit