gpt4 book ai didi

java - 我可以在 Android 中为 DefaultHttpClient 设置 getaddrinfo 超时吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:59 25 4
gpt4 key购买 nike

在 Android 应用程序中,我正在尝试测试用户是否具有有效的互联网连接。如果你有兴趣,前面的问题有一些背景Detecting limited network connectivity in Android?

代码基本上是这样的:

try {
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);

httpClient = new DefaultHttpClient(myParams);

request = new HttpHead(url);
response = httpClient.execute(request);
statusCode = response.getStatusLine().getStatusCode();

if (statusCode != 200)
{
return false;
}
return true;

} catch(Exception e) {
return false;
}

我可以使用 HttpConnectionParams 控制连接和套接字的超时。但是,如果我的设备已连接到 Wifi,但 wifi 无法访问互联网,则我在异常中遇到的错误是:

libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)

Unable to resolve host "www.example.com": No address associated with hostname

看起来它在 DNS 查找时超时。我可以控制 DNS 查找的超时吗? httpClient.execute 大约需要 45 秒才能失败,但出现上述异常。我希望它早点放弃。

最佳答案

我做了一点功课,似乎无法调整 DNS 查找超时。因此,我认为更好的方法是进行显式 DNS 查找,这样我就可以控制它(并希望缓存结果以加快下一次尝试)。所以这让我想到了简单的:

InetAddress addr = InetAddress.getByName(hostname);

但这也有 45 秒的超时。其他人提到有 no control of the timeout for getByName() .最后,我偶然发现了一个简单的解决方案,只需在单独的线程中启动查找并管理您自己的超时。 This blog post很好地说明了这一点。

private static boolean testDNS(String hostname) {
try
{
DNSResolver dnsRes = new DNSResolver(hostname);
Thread t = new Thread(dnsRes);
t.start();
t.join(1000);
InetAddress inetAddr = dnsRes.get();
return inetAddr != null;
}
catch(Exception e)
{
return false;
}
}

private static class DNSResolver implements Runnable {
private String domain;
private InetAddress inetAddr;

public DNSResolver(String domain) {
this.domain = domain;
}

public void run() {
try {
InetAddress addr = InetAddress.getByName(domain);
set(addr);
} catch (UnknownHostException e) {
}
}

public synchronized void set(InetAddress inetAddr) {
this.inetAddr = inetAddr;
}
public synchronized InetAddress get() {
return inetAddr;
}
}

使用它我可以首先测试设备是否可以解析主机名,然后如果它成功进行完整的连接测试。

关于java - 我可以在 Android 中为 DefaultHttpClient 设置 getaddrinfo 超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com