【问题标题】:Android UnknownHostException Facebook SDKAndroid UnknownHostException Facebook SDK
【发布时间】:2012-09-18 09:50:01
【问题描述】:

情况是这样的。我的应用程序运行良好,并且能够与 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
  • 可能是你的网速很慢..
  • @IlyaKogan,没有一些代码 sn-p 和异常堆栈跟踪,我们只能猜测。
  • @yorkw,我的代码与 THelper 链接到的代码非常相似:stackoverflow.com/q/8957557/326370。我使用与 Rob 相同的对象,但使用 HttpGet 而不是 HttpPost。

标签: java android http ip android-networking


【解决方案1】:

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

Issue 7904: Android does not support TTL and caches DNS result for 10 minutes

自 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,参见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 版本,请尝试调整这两个属性,看看是否有任何不同。

【讨论】:

    【解决方案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);
    

    我的问题也减少了。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • Log.wtf(TAG,"问题仍然存在");
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多