【问题标题】:Okhttp3 set timeout is uselessOkhttp3设置超时没用
【发布时间】:2016-12-25 09:24:23
【问题描述】:
OkHttpClient client;

client = new OkHttpClient.Builder()
        .connectTimeout(5, TimeUnit.SECONDS)
        .writeTimeout(5, TimeUnit.SECONDS)
        .readTimeout(5, TimeUnit.SECONDS)
        .build();

Request request22 = new Request.Builder()
        .url("http://www.goo.com/")
        .build();

Utils.myLog("-begin-");
Response response = null;
try {
    response = client.newCall(request22).execute();
    if (response.isSuccessful()) {
        Utils.myLog("-donw-");
    }
} catch (Exception e) {
    e.printStackTrace();
    Utils.myLog("-error-" + e.toString());
}

这是我的代码,我已将超时设置为 5 秒,但在“开始”之后仍需要 20 秒 才能收到“错误未知主机异常”?为什么我的代码没用?我看过OKHTTP的源码,默认超时是10秒(如果我是对的),我很困惑。

任何人都可以提供帮助,我真的很感激。

【问题讨论】:

  • 提及“未知主机”的错误消息可能表示 DNS 解析器问题:20 秒可能指的是 DNS 超时(DNS 解析器在 [仍然] 没有答案时根本不回复)而不是 TCP 握手超时.我将首先了解您的软件框架如何联系名称服务器和/或检查您的特定网络配置。
  • @AntonSamsonov 感谢您的回答!如果没有办法避免DNS问题,无论出现什么异常如何设置超时?再次感谢!
  • 对于常规的 GNU/Linux 系统,可以在 /etc/resolv.conf 中配置 DNS 尝试和超时,尽管我强烈建议不要这样做,因为默认 DNS 计时是事实上的标准。但是,在 Android 上,这种配置不太可能可用。此外,OkHttp 可能使用自己的基于 Java 的解析器(我对 OkHttp 和 Java 都不熟悉,只是想象所有可能性),因此您可能需要影响该解析器而不是系统提供的服务。
  • @angryd 请看看这个answer 它对我来说工作正常。

标签: android okhttp3


【解决方案1】:

目前,OkHttp 无法中断耗时的 DNS 请求(请参阅https://github.com/square/okhttp/issues/95),但您仍然可以执行以下操作:

        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .readTimeout(15, TimeUnit.SECONDS)
                .writeTimeout(15, TimeUnit.SECONDS)
                .connectTimeout(15, TimeUnit.SECONDS)
                .dns(hostname -> Single.fromCallable(
                        () -> Arrays.asList(InetAddress.getAllByName(hostname))
                ).timeout(15, TimeUnit.SECONDS)
                        .subscribeOn(Schedulers.io())
                        .observeOn(Schedulers.computation())
                        .onErrorReturnItem(new ArrayList<>())
                        .blockingGet())
                .build();

【讨论】:

  • 谢谢。快速提问,为什么要observeOn(Schedulers.computation())?你认为没有 observeOn 的 subscribeOn(Schedulers.trampoline()) 可能有意义吗?甚至没有任何 subscribeOn 或 observeOn
猜你喜欢
  • 2018-12-19
  • 2017-06-04
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多