安卓 UnknownHostException Facebook SDK

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());

你找到解决方案了吗?这种情况也发生在我身上,不过我遇到的不是Facebook而是我的自己的服务器,我使用的是DefaultHttpClient - Ilya Kogan
1
可能是您的网络连接较慢。 - Mehul Ranpara
1
@IlyaKogan,如果没有代码片段和异常堆栈跟踪,我们除了猜测之外,无法提供太多帮助。 - yorkw
@JamesFazio,有什么解决方法吗? - Ilya Kogan
@IlyaKogan 我捕获了特定的错误,然后我再次执行完全相同的 FQL,第二次返回正确的信息。 - James Fazio
显示剩余3条评论
3个回答

4

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

Issue 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.ttlnetworkaddress.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,请尝试调整这两个属性并查看是否有任何差异。


2
我没有关于网络连接、DNS缓存和TTL管理的核心概念知识。
但是我遇到了同样的问题,那时候我只是作为一种解决方法,在Facebook项目的Util.java中进行了一些更改,然后将其用于我的项目。这两个更改只是从不同的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

如果您能发布代码,那将有所帮助......但根据我的经验,调用httpClient.getConnectionManager().shutdown()可以解决此问题。


Log.wtf(TAG,"问题仍然存在"); - MKJParekh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接