Android UnknownHostException Facebook SDK

时间:2012-09-26 17:38:53

标签: java android http ip 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)

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

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

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

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

3 个答案:

答案 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.ttlnetworkaddress.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();解决了这个问题。