2016-06-30 1 views
10

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

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

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(); 
} 
+0

Настройка заголовка таким образом (ровно 50000) решила проблему. .header («Cache-Control», String.format («max-age =% d», 50000)) –

+0

@WaqarYounis Спасибо за ответ, но он не работает. –

+0

Вы решили эту проблему? У меня есть эта проблема при пробуждении приложения из фона с помощью GCM. –

ответ

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(); 
     } 
    }; 
} 
0

На самом деле это из-за проблемы связи, в моем случае Wi-Fi был отключен и вызывает все эти проблемы, пожалуйста, найти эту link где я нашел ответ