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

3 に答える 3

4

java.net.UnknownHostException通常、ホストの IP アドレスを解決できなかったことを意味しますが、実際の原因はケースバイケースで異なります。コードが適切に実装されていて (使用している API、HttpUrlConnection または DefaultHttpClient に関係なく)、それでも断続的に発生する場合は、DNS キャッシュと TTL 管理に関連する古い Android システムのバグである可能性が非常に高くなります。

問題 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.ttlを調整することを提案しており、古いソース コードのnetworkaddress.cache.negative.ttlJavaDoc を参照してください。

/**
 * ... ...
 *
 * <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 つのプロパティを調整してみて、違いがあるかどうかを確認してください。

于 2012-11-23T00:41:36.253 に答える
2

コードを投稿できれば役に立ちますが、私の経験では、httpClient.getConnectionManager()。shutdown();を呼び出します。この問題を解決しました。

于 2012-11-27T06:44:29.007 に答える
2

ネットワーク接続、DNS キャッシング、および TTL 管理に関する中心的な概念の知識はありません。

しかし、同じ問題が発生し、その時点で回避策としてFacebook プロジェクトのUtil.java [Facebook SDK のソース プロジェクト]にいくつかの変更を加えてから、それを自分のプロジェクトに使用しました。その2つの変更は、異なる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);

そして、私の問題は軽減されました。

于 2012-11-26T06:59:35.330 に答える