簡體   English   中英

Android UnknownHostException Facebook SDK

[英]Android UnknownHostException Facebook SDK

情況就是這樣。 我的應用程序運行正常,並能夠與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());

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.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版本。

我沒有關於網絡連接和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);

我的問題減少了。

如果您可以發布代碼,這將有所幫助......但是,根據我的經驗,調用httpClient.getConnectionManager()。shutdown(); 解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM