7

このメソッドをアプリケーションから逐語的にコピーしていますが、これはまだ完了していませんが、問題がスムーズに進まない場合は、タイムアウトスタックトレースを提供しようとします。

protected boolean isHttpAlive()  {
  boolean isHttpOk = false;

  HttpURLConnection httpConnection = null;
  try {
    URL gurl = new URL("http://www.amazon.com/");
    URLConnection connection = gurl.openConnection();
    connection.setConnectTimeout(5 * 1000); // 5 seconds!
    httpConnection = (HttpURLConnection) connection;
    int responseCode = httpConnection.getResponseCode();
    if (responseCode == HttpURLConnection.HTTP_OK)
      isHttpOk = true;
  } 
  catch (Exception e) {                    
    e.printStackTrace();
  }
  finally {
    if (httpConnection != null)
      httpConnection.disconnect();
  }

  return isHttpOk;
}

テストデバイスの1つ(Droid)で、問題が発生すると例外が発生しますが、上記のコードで設定した5秒ではなく、 6分36秒後になります。

のタイムアウト例外がスローされますgetResponseCode()

なんで?

私は何が欠けていますか?

4

2 に答える 2

5

私の推測では、接続しているURL(この場合はAmazon)には複数のIPアドレスがあります。

ドキュメントの警告に従って:

ホスト名が複数のIPアドレスに解決される場合、このクライアントはRFC3484の順序でそれぞれを試行します。これらの各アドレスへの接続が失敗した場合、接続の試行で例外がスローされる前に、複数のタイムアウトが経過します。IPv6とIPv4の両方をサポートするホスト名には、常に少なくとも2つのIPアドレスがあります。


編集:アプリをからに
変換したいので、私はまだこれを調査しています。あなたの例では、6分以上のタイムアウトに満足していません。HTTPClientURLConnection

私もこのブログに出くわしました。connection.setReadTimeout(READ_TIMEOUT_MILLISECONDS);彼は同様に追加することを提案します、それがあなたのケースを助けるかどうかわかりません。

于 2012-07-20T16:23:15.463 に答える