java - 使用 okhttp3 检查和恢复缓存文件

标签 java android caching okhttp

我正在使用 okhttp3 向服务器发出请求,而不是使用改造。 我的想法是调用电话并将响应保存在缓存中 15 分钟。 如果在这 15 分钟内,再次请求,恢复缓存响应,15 分钟后,再次向服务器请求。

这是我的代码:

public class Handler_JSON_get {

    public Handler_JSON_get() {

    }

    public String makeServiceCall(String url, JSONObject data) {
        final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

        Cache cache = new Cache(new File(Environment.getExternalStorageDirectory().getPath() + "/Android/data/MY_PACKAGE/", "cache"), 10 * 1024 * 1024);

        OkHttpClient okHttpClient;

            Log.i("2134","Usando caché");
             okHttpClient = new OkHttpClient.Builder()
                    .addNetworkInterceptor(provideCacheInterceptor())
                    .readTimeout(45, TimeUnit.SECONDS)
                    .protocols(Arrays.asList(Protocol.HTTP_1_1))
                    .addInterceptor(provideCacheInterceptor())
                    .cache(cache)
                    .build();

        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();

        try {
            Response response = okHttpClient.newCall(request).execute();

            Log.i(TAG,"Response:"+response.code());

            return response.body().string();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    Interceptor provideCacheInterceptor() {
        return new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Response response = chain.proceed(chain.request());
                CacheControl cacheControl = new CacheControl.Builder()
                        .maxAge(15, TimeUnit.MINUTES)
                        .build();

                return response.newBuilder()
                        .header("cache", cacheControl.toString())
                        .build();
            }
        };
    }
}

问题是他总是调用服务器,我有很多疑惑。

okhttp3 负责查看存储中是否有缓存的响应?

调用保存了一个日志文件,这是正确的文件吗?

我错过了什么或者我做错了什么?

我看到有很多关于它的问题,但我无法使这些答案与我的代码兼容。

我真诚地感谢我的代码中正常运行所必需的部分,我开始发疯了。

提前致谢。

最佳答案

我花了一些时间才发现:正确的 header 名称是 Cache-Control ,不是缓存:

return response.newBuilder()
                    .header("Cache-Control", cacheControl.toString())
                    .build();

而且似乎用addNetworkInterceptor 添加拦截器就足够了,没有必要也用addInterceptor 添加它

关于java - 使用 okhttp3 检查和恢复缓存文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808713/

相关文章:

java - 模拟类的内部方法

java - 验证 Spring Controller 参数不为空

java - Robolectric Shadow Asset Manager 空指针异常

php - 缓存策略,什么时候缓存变得毫无意义?

java - 使用 Scanner 一次读取一个文件夹中的所有文件会给出 NoSuchElementException

java - 如何将现有的java android转换为flutter(getLifecycle()中出现错误)

android - Sencha touch 中文本字段的文本颜色未反射(reflect)在 Android 设备上

java - Apache Ignite Eviction 在 2.x 中被破坏,但在 1.9 中工作正常

java - 如何在java中调整缓存密集型应用程序?

java - 模拟器中的 OutOfMemoryException