【发布时间】: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 它对我来说工作正常。