Получил эту ошибку с помощью retrofit2 & OkHttp3. Не удалось разрешить хост "<имя-хостa>": нет адреса, связанного с именем хоста

Я использую retrofit 2 и OkHttp3 для запроса данных с сервера. Я просто добавил автономный кэш-код, но он не работает должным образом. Я получил сообщение об ошибке "Не удалось разрешить хост" < > ": Нет адреса, связанного с именем хоста."

Это происходит, когда он пытается получить извлечение данных из кеша (при отсутствии подключения к Интернету). Ниже приведен фрагмент кода.

public static Interceptor provideCacheInterceptor() {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response response = chain.proceed(chain.request());

            // re-write response header to force use of cache
            CacheControl cacheControl = new CacheControl.Builder()
                    .maxAge(2, TimeUnit.MINUTES)
                    .build();

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

public static Interceptor provideOfflineCacheInterceptor() {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            if (!hasNetwork) {
                CacheControl cacheControl = new CacheControl.Builder()
                        .onlyIfCached()
                        .maxStale(7, TimeUnit.DAYS)
                        .build();

                request = request.newBuilder()
                        .removeHeader("Pragma")
                        .cacheControl(cacheControl)
                        .build();
            }

            return chain.proceed(request);
        }
    };
}

private static Cache provideCache() {
    Cache cache = null;
    try {
        cache = new Cache(new File(AdeptAndroid.getInstance().getCacheDir(), "http-cache"),
                10 * 1024 * 1024); // 10 MB
    } catch (Exception e) {
        Log.d("Test", "Could not create Cache!");
    }
    return cache;
}

И, наконец, метод, который объединяет все это, находится здесь.

private static OkHttpClient provideOkHttpClient() {
    return new OkHttpClient.Builder()
            .addInterceptor(provideHttpLoggingInterceptor())
            .addInterceptor(provideOfflineCacheInterceptor())
            .addNetworkInterceptor(provideCacheInterceptor())
            .cache(provideCache())
            .build();
}

Ответ 1

В ответе сервера есть заголовок "Pragma: no-cache". Вы должны удалить этот заголовок в своем ответном перехватчике, а не в своем перехватчике запросов.

В вашем текущем коде вы удалили его из перехватчика запросов.

Ваш provideCacheInterceptor() должен выглядеть следующим образом:

public static Interceptor provideCacheInterceptor() {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response response = chain.proceed(chain.request());

            // re-write response header to force use of cache
            CacheControl cacheControl = new CacheControl.Builder()
                   .maxAge(2, TimeUnit.MINUTES)
                   .build();

           return response.newBuilder()
                    .header(CACHE_CONTROL, cacheControl.toString())
                    .removeHeader("Pragma")
                    .build();
        }
    };
}

Ответ 2

На самом деле это из-за проблемы с подключением. В моем случае wifi был отключен и вызвал все эти проблемы, найдите ссылку Я нашел ответ