5

这是情况。我的应用程序运行良好,并且能够与 URL 建立连接。但是在让应用程序运行几个小时后,突然 Facebook 请求给了我以下错误。

09-26 10:01:25.175: W/System.err(252): java.net.UnknownHostException: Host is unresolved: xyz.com:80
09-26 10:01:25.175: W/System.err(252):  at java.net.Socket.connect(Socket.java:1037)
09-26 10:01:25.175: W/System.err(252):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
09-26 10:01:25.175: W/System.err(252):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager$ConnectionPool.getHttpConnection(HttpConnectionManager.java:145)
09-26 10:01:25.175: W/System.err(252):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager.getConnection(HttpConnectionManager.java:67)
09-26 10:01:25.175: W/System.err(252):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getHTTPConnection(HttpURLConnection.java:821)
09-26 10:01:25.175: W/System.err(252):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:807)
09-26 10:01:25.175: W/System.err(252):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1051)
09-26 10:01:25.175: W/System.err(252):  at java.net.URL.openStream(URL.java:653)

此错误发生在应用程序和模拟器上。当我注销我的应用程序并重新连接到 Facebook 时,连接再次起作用。

我应该注意:当我与自己的服务器建立连接时,不会出现问题。

此错误是由以下行引起的...

mAsyncFacebookRunner.request("fql", paramaters,
                new FQLRequestListener());
4

3 回答 3

4

java.net.UnknownHostException通常意味着无法解析主机的 IP 地址,但实际原因可能会因情况而异。如果代码实现正确(不管你使用哪个 API,HttpUrlConnection 或 DefaultHttpClient)并且仍然间歇性发生,很可能是旧 Android 系统中与 DNS 缓存和 TTL 管理相关的错误:

问题 7904:Android 不支持 TTL 并缓存 DNS 结果 10 分钟

自 Android 4.1 起已修复此问题,请参阅InetAddress API Doc中的额外说明:

DNS缓存

在 Android 4.0 (Ice Cream Sandwich) 及更早版本中,DNS 缓存由 InetAddress 和 C 库执行,这意味着 DNS TTL 无法正确处理。在以后的版本中,缓存仅由 C 库完成,并且支持 DNS TTL。

对于旧的 Android 版本,Android 建议调整 Java 级别的 DNS 属性networkaddress.cache.ttl,请参阅旧源代码networkaddress.cache.negative.ttl中的 JavaDoc :

/**
 * ... ...
 *
 * <h4>DNS caching</h4>
 * <p>On Android, addresses are cached for 600 seconds (10 minutes) by default. Failed lookups are
 * cached for 10 seconds. The underlying C library or OS may cache for longer, but you can control
 * the Java-level caching with the usual {@code "networkaddress.cache.ttl"} and
 * {@code "networkaddress.cache.negative.ttl"} system properties. These are parsed as integer
 * numbers of seconds, where the special value 0 means "don't cache" and -1 means "cache forever".
 *
 * ... ...
 */

相关讨论:

如果您的目标是旧的 Android 版本,请尝试调整这两个属性,看看是否有任何不同。

于 2012-11-23T00:41:36.253 回答
2

如果您可以发布代码会有所帮助.....但是,根据我的经验,调用 httpClient.getConnectionManager().shutdown(); 解决了这个问题。

于 2012-11-27T06:44:29.007 回答
2

我没有任何关于网络连接、DNS 缓存和 TTL 管理的核心概念知识。

但同样的问题发生在我身上,当时只是作为一种解决方法,我在Facebook 项目的Util.java [Facebook SDK 的源项目] 中做了一些更改,然后将它用于我的项目。这两个更改仅用于不同的 stackoverflow 答案。

在函数openUrl(String url, String method, Bundle params)

替换这一行,

 HttpURLConnection conn =
            (HttpURLConnection) new URL(url).openConnection();

有了这些线条,

        try {
            InetAddress i = InetAddress.getByName(url);
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
        }

        HttpURLConnection conn = (HttpURLConnection) new URL(url)
                .openConnection();
        conn.setConnectTimeout(50000);

我的问题减少了。

于 2012-11-26T06:59:35.330 回答