Проверьте и восстановите кэшированный файл с помощью okhttp3 - PullRequest
1 голос
/ 28 июня 2019

Я использую 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 отвечает за проверку наличия кэшированного ответа в хранилище?

При вызове сохраняется файл журнала,это правильный файл?

Что мне не хватает или что я делаю не так?

Я видел, что по этому поводу довольно много вопросов, но я не могу сделать эти ответы совместимымис моим кодом.

Я был бы искренне признателен за части, которые необходимы в моем коде для правильной работы, я начинаю сходить с ума.

Заранее спасибо.

1 Ответ

1 голос
/ 01 июля 2019

Мне потребовалось некоторое время, чтобы определить это: правильное имя заголовка Cache-Control, а не cache:

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

Также кажется, что добавления перехватчика с addNetworkInterceptor достаточно, нет необходимости также добавлять его с addInterceptor

...