情况如下。我的应用程序运行正常,并能够与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());
答案 0 :(得分:4)
java.net.UnknownHostException
通常意味着无法解析主机的IP地址,但实际原因可能会因具体情况而异。如果代码是正确实现的(无论您使用哪种API,HttpUrlConnection或DefaultHttpClient)并且它仍然间歇性地发生,那很可能是旧的Android系统中与DNS缓存和TTL管理相关的错误:
Issue 7904: Android does not support TTL and caches DNS result for 10 minutes
自Android 4.1起修复此问题,请参阅InetAddress API Doc中的额外备注:
DNS缓存
在Android 4.0(冰淇淋三明治)及更早版本中,DNS缓存由InetAddress和C库执行,这意味着DNS TTL无法正确兑现。在以后的版本中,缓存仅由C库完成,并且DNS TTL很受尊重。
对于旧的Android版本,Android建议调整Java级DNS属性networkaddress.cache.ttl
和networkaddress.cache.negative.ttl
,请参阅old source code中的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版本。
答案 1 :(得分:2)
我没有任何关于网络连接和DNS缓存以及TTL管理的核心概念知识。
但同样的问题发生在我当时仅作为解决方法我在 Facebook项目Util.java <中进行了少量更改 / strong> [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);
我的问题减少了。
答案 2 :(得分:2)
如果您可以发布代码,这将有所帮助......但是,根据我的经验,调用httpClient.getConnectionManager()。shutdown();解决了这个问题。