Android UnknownHostException Facebook SDK

Jam*_*zio 5 java ip android http android-networking

情况就是这样.我的应用程序运行正常,并能够与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)
Run Code Online (Sandbox Code Playgroud)

应用程序和模拟器上都会发生此错误.当我退出我的应用程序并重新连接到Facebook时,连接再次起作用.

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

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

mAsyncFacebookRunner.request("fql", paramaters,
                new FQLRequestListener());
Run Code Online (Sandbox Code Playgroud)

yor*_*rkw 4

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

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

从 Android 4.1 开始,此问题已得到修复,请参阅InetAddress API 文档中的额外说明:

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".
 *
 * ... ...
 */
Run Code Online (Sandbox Code Playgroud)

相关讨论:

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