当前位置: 首页 > 知识库问答 >
问题:

2出现了这个错误

孟杰
2023-03-14

我正在使用改造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();
}

共有3个答案

艾跃
2023-03-14

请在模拟器上的清单文件权限关闭飞机模式中检查您的网络“打开”

庄弘业
2023-03-14

您的服务器响应有一个“普拉格马:无缓存”标头。您应该在响应拦截器中删除这个标头,而不是请求拦截器。

在当前代码中,您已经将其从请求拦截器中删除。

您的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();
        }
    };
}
程峻
2023-03-14

我在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()
        }
    }
 类似资料:
  • 错误:任务“app:transformClassesWithDexForDebug”的执行失败 com.android.build.api.transform。TransformException:com.android.ide.common.process。ProcessException:org.gradle.process.internal。ExecException:处理C:\Progra

  • 为什么会引发主线程上的网络异常?its在异步任务上 } 编辑: 完整代码: logcat:

  • 问题内容: printf下划线为红色并给出错误信息?怎么了?我用过Eclipse 问题答案: 从Java 5开始可用。因此,看起来您的项目已配置为使用Java 1.4。右键单击更改项目的配置,然后转到“属性”: 选择Java Build Path选项,并确保您为项目使用正确的Java JDK版本。 选择Java编译器选项,并确保您使用的是Java 1.5或更高版本。 如果碰巧要用Java 8创建项

  • 我收到了一个名为 我在这里做错了什么?我无法修复这个错误,我正在尝试使机器人检查我的不和ID,然后发送我的“注释”在那里的屏幕截图。 下面是我的mongodb指南针的截图。 https://imgur.com/a/r0pl106 这就是我的职能。

  • 这是我的pom文件,我已经升级到springboot2.5.12,我需要更新或添加任何其他依赖项吗? 我的Junit测试用例抛出此错误 原因:java。lang.ClassNotFoundException:Reactor。util。上下文java的ContextView。基本/jdk。内部的装载机。内置ClassLoader。java上的loadClass(BuiltinClassLoader.

  • 我打算在这个应用程序中添加一个新插件,它在ionic服务上运行良好,但当我决定使用ionic cordova构建android时,却出现了这个错误 ionic cordova build android的输出--详细 当前节点版本 科尔多瓦版 npm版本 其他: 附加信息:离子型: ionic (Ionic CLI) : 4.1.2 (/usr/local/lib/node_modules/ion