3

Web サービスに接続するアプリケーションがあります。アプリケーションのライフサイクルの間、自分の接続タイプに忠実であり続ける限り、WIFI または 3G を使用して何回でも問題なく Web サービスに接続できます。それは、WIFIから3Gに切り替えない場合です。WIFI から 3G に切り替えると、もう応答がありません。接続が応答を待ち続けています。

以下の4つのシナリオを試しました。3番目のシナリオにのみ問題があります。何が問題なのですか?

第 1 のシナリオ: 接続は常に WIFI である (OK)

  1. アプリケーションは、WIFI を使用して Web サービスに接続します。
  2. 応答が正常に受信されました。
  3. アプリケーションは、WIFI を使用して Web サービスに再度接続します。
  4. 応答が正常に受信されました。

2 番目のシナリオ: 接続は常に 3G です (OK)

  1. アプリケーションは、WIFI を使用して Web サービスに接続します。
  2. 応答が正常に受信されました。
  3. アプリケーションは、WIFI を使用して Web サービスに再度接続します。
  4. 応答が正常に受信されました。

シナリオ 3: 接続が WIFI から 3G に切り替わる (無応答)

  1. アプリケーションは、WIFI を使用して Web サービスに接続します。
  2. 応答が正常に受信されました。
  3. 接続を 3G に切り替えました。WIFIが無効になっています。3G が有効になっています。
  4. アプリケーションは、3G を使用して Web サービスに再度接続します。
  5. 応答がないか、エラーが受信されました。アプリケーションは応答を待ち続けます。getResponseCodeが呼び出される前に最後のログが表示されました。

シナリオ 4: 接続が 3G から WIFI に切り替わる (OK)

  1. アプリケーションは 3G を使用して Web サービスに接続します。
  2. 応答が正常に受信されました。
  3. 接続がWIFIに切り替わりました。3G が無効になっています。WIFI が有効になっています。
  4. アプリケーションは、WIFI を使用して Web サービスに再度接続します。
  5. 応答が正常に受信されました。

私の推測では、デフォルトでHttpURLConnectionは WIFI が 3G よりも優れた接続タイプであると考えています。そのため、接続が WIFI から 3G に切り替えられると、HttpURLConnectionは 3G の認識を拒否し、引き続き WIFI を使用して接続しようとします。一方、HttpURLConnectionWIFI の方が優れた接続タイプであるため、3G から WIFI への切り替えが可能です。私はこれで正しいですか?その場合、WIFI から 3G への切り替えを許可するにはどうすればよいですか?

以下は私のコードのスニペットです: (私は Web サービスに接続するたびに呼び出します。)

//open new connection
httpsURLConnection = (HttpURLConnection) ((new URL(url)).openConnection());
httpsURLConnection.setDoInput(isDoInput);
httpsURLConnection.setDoOutput(isDoOutput);

try
{
    //supply parameters
    OutputStreamWriter wr = new OutputStreamWriter(httpsURLConnection.getOutputStream());
    wr.write(data);
    wr.flush();

    if(httpURLConnection != null)
    {
        if (httpsURLConnection.getResponseCode() == HttpsURLConnection.HTTP_OK) //connection hangs here
        {
            //some code
        }
        else
        {
            //some code
        }
    }

}catch(Exception e)
{

}
4

2 に答える 2

2

理由はわかりませんがSystem.setProperty("http.keepAlive", "false")、コードを追加することで問題は解決します。

Android Developers Blog(androids-http-clients)によると、 HttpURLConnectionFroyoより前にバグがあり、上記のように接続プールを無効にすることで解決できます。ただし、私はGingerbreadを使用しているので、HttpURLConnectionがアプリケーションでまだ誤動作している理由がわかりません。

他の人へ:もっと説明があれば、遠慮なく私の投稿を編集してください。

于 2012-04-23T05:30:23.960 に答える
1

Wi-Fi で接続してから 3G に戻すと、接続ドロップの例外が表示されますか?

私の知る限り、wifi で接続を開くと、同じ接続を 3G に使用することはできません。既存の接続を切断し、3G で新しい接続を再確立する必要があります。

リクエストに接続タイムアウトを設定していないため、接続が切断されたときに HttpUrlConnection が接続が失われたことを認識するのに長い時間がかかるため、問題が発生する可能性があると推測しています。

いくつかのデフォルトのタイムアウトを使用して、http 接続にユーティリティ ライブラリをまとめました。とにかくこれが役立つかどうかを確認してください。

https://github.com/nareshsvs/android-libraries

于 2012-04-20T09:05:29.063 に答える