Android 改装2&;时出现此错误;OkHttp3。“无法解析主机”&书信电报;主机名>&引用;:没有与主机名关联的地址

Android 改装2&;时出现此错误;OkHttp3。“无法解析主机”&书信电报;主机名>&引用;:没有与主机名关联的地址,android,okhttp,retrofit2,offline-caching,okhttp3,Android,Okhttp,Retrofit2,Offline Caching,Okhttp3,我正在使用改造2和OkHttp3从服务器请求数据。我刚刚添加了一个脱机缓存代码,但它没有按预期工作。我收到错误“无法解析主机”:没有与主机名关联的地址 当尝试从缓存中获取检索数据时(没有internet连接时),会发生这种情况。下面是一段代码片段 public static Interceptor provideCacheInterceptor() { return new Interceptor() { @Override public Response

我正在使用改造2和OkHttp3从服务器请求数据。我刚刚添加了一个脱机缓存代码,但它没有按预期工作。我收到错误“无法解析主机”:没有与主机名关联的地址

当尝试从缓存中获取检索数据时(没有internet连接时),会发生这种情况。下面是一段代码片段

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

您的服务器响应有一个“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();
        }
    };
}
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()
        }
    }

我在与kotlin的项目中遇到了相同的错误,我这样修复了它:

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

请在Emulator上的Manifest file permission OFF-Airline mode(清单文件许可离机模式)中检查网络“打开”

当尝试访问连接网络上不可用的主机名时,会发生这种情况。检查您是否可以通过设备的web浏览器访问此URL。如果没有:这是您的问题。

对于我来说,由于emulator中没有internet连接,因此引发了错误。

通过这种方式设置标头(正好50000个)解决了问题。header(“缓存控制”,String.format(“max age=%d”,50000))@WaqarYounis感谢您的回复,但它也不起作用。您解决了这个问题吗?我在使用GCM从后台唤醒应用程序时遇到了这个问题。@android_griezmann您是否找到了解决方法,因为存在相同的问题,但无法解决。@dexmorgan不!很抱歉这么说,但到目前为止还没有找到任何解决方案。无法解决我的问题: