【发布时间】:2012-07-19 21:49:57
【问题描述】:
我正在从我的应用程序中逐字复制此方法,该方法尚未完成,但如果事情进展不顺利,它会尝试为我提供超时堆栈跟踪:
protected boolean isHttpAlive() {
boolean isHttpOk = false;
HttpURLConnection httpConnection = null;
try {
URL gurl = new URL("http://www.amazon.com/");
URLConnection connection = gurl.openConnection();
connection.setConnectTimeout(5 * 1000); // 5 seconds!
httpConnection = (HttpURLConnection) connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK)
isHttpOk = true;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (httpConnection != null)
httpConnection.disconnect();
}
return isHttpOk;
}
现在在我的一台测试设备 (Droid) 上,当出现问题时,我确实会收到 the exception,但只是在 6 分 36 秒之后,而不是我在上面的代码。
getResponseCode() 抛出超时异常。
为什么?
我错过了什么?
【问题讨论】:
-
我最好的猜测是,您要连接的 URL(在本例中为 Amazon)有多个 IP 地址。根据文档中的警告“如果主机名解析为多个 IP 地址,则此客户端将按 RFC 3484 顺序尝试每个地址。如果连接到这些地址中的每一个失败,则在连接尝试引发异常之前将经过多次超时。主机名同时支持 IPv6 和 IPv4 的总是至少有 2 个 IP 地址。”
-
@Asok 我认为你成功了。请作为答案发布,突出显示在连接尝试引发异常之前会经过多次超时,以便我接受。
-
我观察到的是超时发生在 60 秒的倍数处,而您的 5 秒可能不起作用。
标签: android httpurlconnection urlconnection android-networking