OkHttp 设置了 Cache 未成功写入

date
Aug 12, 2021
slug
some error
status
Published
tags
问题
okhttp
summary
type
Post
notion image
使用 OkHttp 自带的缓存配置 + 自定义 Cache 信息完成缓存,OkHttp 未成功写入。

问题 Log 及相关信息

缓存的临时文件已经生成,且 header 所属文件已有相关信息,但 response 文件中没有。
 

问题原因

response#body#close 没有被调用。
response#body 需要手动调用,如果使用了 Retrofit,则在其内部的 OkHttpCall#parseResponse 中有 OkHttp3Response#body#close 的调用
OkHttp 相关源码
在 edit#commit 内部,会将 response#body 写入本地磁盘
notion image
Retrofit 相关源码
notion image

可能复现的场景

必现
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());
            }
        });

解决方案

  1. 使用 OkHttp 时手动关闭 response#body
  1. 改用 Retrofit

参考链接


© Craig Hart 2021 - 2025