Обслуживать кеш по таймауту в охтт3 - PullRequest
0 голосов
/ 26 сентября 2018

В okhttp3, если время соединения истекает в режиме CONNECT или READ, есть ли способ получить кеш из okhttp?Вместо сбоя подключения я хочу обслуживать пользователя из автономного кэша на случай, если запрос занимает слишком много времени.

1 Ответ

0 голосов
/ 04 декабря 2018

У меня возникла похожая проблема.Я хотел вернуться к кешированию всякий раз, когда мой запрос истекал (я не против, в каком состоянии), или когда соединение разрывалось, или когда соединение недоступно.Для этого я создал перехватчик, который сначала проверит наличие соединения, а затем перехватит исключения при выполнении запроса.Если есть тайм-аут, то он выдаст исключение, после чего мы откатимся к агрессивному кешированию.

Таким образом, сначала вам нужно настроить клиент okhttp на использование кэша, а затем использовать перехватчик для его использования.кэшировать лучше.

public OkHttpClient getOkHttpClient() {
    File cacheFile = new File(context.getCacheDir(), "okHttpCache");
    Cache cache = new Cache(cacheFile, CACHE_SIZE);

    ConnectivityInterceptor connectivityInterceptor = new ConnectivityInterceptor(networkStateHelper);
    OkHttpClient.Builder builder = new OkHttpClient.Builder().cache(cache).addInterceptor(connectivityInterceptor);
    return builder.build();
}

После этого вы можете использовать этот простой перехватчик для принудительного использования кэша.Обычно кэш используется, когда сервер отвечает 340, что означает, что никаких изменений нет, поэтому мы можем принимать кешированные ответы, но для этого, конечно, требуется активное подключение к Интернету.Тем не менее, мы можем принудительно использовать кэш, чтобы он по возможности принимал любой ответ из кэша, что удобно, когда вы находитесь в автономном режиме или когда у вас есть тайм-ауты

public class ConnectivityInterceptor implements Interceptor {

    // NetworkStateHelper is some class we have that checks if we are online or not.
    private final NetworkStateHelper networkStateHelper;

    public ConnectivityInterceptor(NetworkStateHelper networkStateHelper) {
        this.networkStateHelper = networkStateHelper;
    }

    @Override
    public Response intercept(@NonNull Chain chain) throws IOException {
        // You can omit this online check or use your own helper class
        if (networkStateHelper.isNotOnline()) {
            return getResponseFromCache(chain, request);
        }
        try {
            Response response = chain.proceed(request);
            return new Pair<>(request, response);
        }
        catch (Exception exception) {
            Log.w(exception, "Network failure discovered, trying cache fallback");
            return getResponseFromCache(chain, request);
        }

    }

    private Response getResponseFromCache(Interceptor.Chain chain,
            Request request) throws IOException {
        // We just create a new request out of the old one and set cache headers to it with the cache control. 
        // The CacheControl.FORCE_CACHE is already provided by OkHttp3
        request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();

        // Now we proceed with the request and OkHttp should automatically fetch the response from cache or return
        // a failure if it is not there, some 5xx status code
        return chain.proceed(request);
    }

}
...