Кэширование сетевых запросов с помощью Okhttp3.0 и retrofit2

Я использую Retrofit2 и OKHTTP3 для REST API в своем приложении для Android. Мое требование: я должен кэшировать запросы на использование приложения в автономном режиме. Дело в том, что я могу кэшировать запросы. Но когда пользователь снова подключается к сети, данные должны быть извлечены из серверной части свежими, они не должны обслуживать кешированный ответ. Как я могу этого добиться. Ниже мой сетевой перехватчик

Сетевой перехватчик

public class CachingInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();


            if (Util.isOnline()) {
                request = request.newBuilder()
                        .header("Cache-Control", "only-if-cached")
                        .build();
            } else {
                request = request.newBuilder()
                        .header("Cache-Control", "public, max-stale=2419200")
                        .build();
            }

        Response response= chain.proceed(request);
        return response.newBuilder()
                .header("Cache-Control", "max-age=86400")
                .build();
    }
}

person Sasank Sunkavalli    schedule 31.10.2016    source источник


Ответы (2)


Обратитесь к этому ответу link OkHttp Interceptor - это правильный способ доступа к кешу в автономном режиме:

person Yuvaraj Ramasamy    schedule 31.10.2016

Понятно . Если устройство находится в автономном режиме, я устанавливаю заголовок Cache-Control как "public, only-if-cached, max-stale=86400" (это установит время ожидания до 1 дня). Теперь, если устройство подключено к сети, оно будет загружено с сервера.

OkHttpClient

okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(new OfflineCachingInterceptor())
            .cache(cache)
            .build();

OfflineCachingInterceptor

public class OfflineCachingInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {

        Request request = chain.request();
        //Checking if the device is online
        if (!(Util.isOnline())) {
            // 1 day stale
            int maxStale = 86400;
            request = request.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                    .build();
        }

        return chain.proceed(request);
    }
}
person Sasank Sunkavalli    schedule 31.10.2016