Получил эту ошибку с retrofit2 и OkHttp3. Невозможно разрешить хост ‹host-name›: нет адреса, связанного с именем хоста

Я использую модификацию 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();
}

person android_griezmann    schedule 30.06.2016    source источник
comment
Установка заголовка таким образом (ровно 50000) решила проблему. .header(Cache-Control, String.format(max-age=%d, 50000))   -  person Muhammad Waleed    schedule 30.06.2016
comment
@WaqarYounis Спасибо за ответ, но он тоже не работает.   -  person android_griezmann    schedule 30.06.2016
comment
Вы решили эту проблему? У меня есть эта проблема при пробуждении приложения из фона с помощью GCM.   -  person Mohammad Qandeel    schedule 21.07.2016
comment
@android_griezmann, вы нашли какой-нибудь обходной путь, потому что возникла та же проблема, и вы не можете ее решить.   -  person    schedule 11.10.2016
comment
@dexmorgan Нет! извините, но до сих пор не нашел решения для этого.   -  person android_griezmann    schedule 11.10.2016
comment
@android_griezmann ты уже нашел решение, у меня такая же проблема   -  person Krunal Kapadiya    schedule 06.10.2017
comment
@KrunalKapadiya Извините, еще нет   -  person android_griezmann    schedule 06.10.2017
comment
Что вы сделали в этом случае?   -  person Krunal Kapadiya    schedule 06.10.2017
comment
Вы нашли какое-нибудь решение?   -  person K Pradeep Kumar Reddy    schedule 16.02.2021


Ответы (5)


У меня была такая же ошибка в моем проекте с kotlin, и я исправил ее следующим образом:

client.addInterceptor(provideOfflineCacheInterceptor(context))
client.addNetworkInterceptor(provideCacheInterceptor(context))

private fun provideOfflineCacheInterceptor(context: Context): Interceptor {
        return Interceptor { chain ->
            var request = chain.request()
            var cacheHeaderValue = if (!hasNetwork(context)!!){
                    "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 1
                } else {
                    "public, max-age=" + 5
                }
            request = request.newBuilder().header("Cache-Control", cacheHeaderValue).build()
            chain.proceed(request)
        }
    }

    private fun provideCacheInterceptor(context: Context): Interceptor {
        return Interceptor { chain ->
            val request = chain.request()
            var cacheHeaderValue = if (!hasNetwork(context)!!){
                    "public, only-if-cached, max-stale=" + 60 * 60 * 24 * 1
                } else {
                    "public, max-age=" + 5
                }
            //request = request.newBuilder().build()
            val response = chain.proceed(request)
            response.newBuilder()
                    .removeHeader("Pragma")
                    .removeHeader("Cache-Control")
                    .header("Cache-Control", cacheHeaderValue)
                    .build()
        }
    }
person Ghizlane Lotfi    schedule 28.12.2018

Ваш ответ сервера имеет заголовок «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();
        }
    };
}
person Ibrahim    schedule 22.12.2017
comment
Не решает мою проблему: stackoverflow.com/questions/52876279/ - person Mena; 21.10.2018

Пожалуйста, проверьте, чтобы ваша сеть была "ВКЛЮЧЕНА" в разрешении файла манифеста ВЫКЛ. Режим полета на эмуляторе

person O Thạnh Ldt    schedule 07.01.2019

Это происходит при попытке доступа к имени хоста, которое недоступно в подключенной сети. Проверьте, можете ли вы получить доступ к этому URL-адресу через веб-браузер устройства. Если нет: это ваша проблема.

person Alix    schedule 22.11.2019

Для меня была выдана ошибка, потому что в эмуляторе не было подключения к Интернету.

person Murli    schedule 04.05.2021