[英]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.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".
*
* ... ...
*/
相關討論:
嘗試調整這兩個屬性,看看是否有任何區別,如果您的目標是舊的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.