Java 使用okhttp3检查并恢复缓存文件

Java 使用okhttp3检查并恢复缓存文件,java,android,caching,okhttp3,Java,Android,Caching,Okhttp3,我使用okhttp3向服务器发出请求,而不是改型。 我的想法是打一个电话,并将响应保存在缓存中15分钟。 如果在这15分钟内再次发出请求,请恢复缓存响应,15分钟后从服务器再次请求 这是我的代码: public class Handler_JSON_get { public Handler_JSON_get() { } public String makeServiceCall(String url, JSONObject data) { final

我使用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负责查看存储器中是否有缓存响应

调用会保存日志文件,这是正确的文件吗

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

我已经看到有很多关于它的问题,但我不能使这些答案与我的代码兼容

我将真诚地感谢我的代码中需要的部分来正常工作,我开始发疯了


提前谢谢。

我花了一些时间才发现它:正确的标题名是,而不是
缓存

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

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

添加拦截器。我想你很接近了,看看这个,这很奇怪,我使用了你的代码,缓存起初没有使用,但在我更改了头名之后,它起作用了。可能还有另一个头阻止okhttp将响应放入缓存。您可以使用类似于
log.i(TAG,response.headers().toString())的内容记录它们在拦截器中可能我不明白,抱歉。我总是从服务器得到200的响应。您如何知道您正在显示缓存响应?我使用了一个包含时间的测试页面