2012-04-20 16 views
3

私はWebサービスに接続するアプリケーションを持っています。私は、アプリケーションのライフサイクル中に私の接続タイプに忠実なままであれば、WIFIや3Gを使用して何の問題もなく何度でもWebサービスに接続できます。つまり、私がWIFIから3Gに切り替わらない場合です。私がWIFIから3Gに切り替えると、私はもはや応答を得ることができません。私の接続は、応答を待っているだけです。WiFi接続から3gに切り替えると接続がハングアップしますか?

以下の4つのシナリオを試しました。私は第3のシナリオにのみ問題があります。何が問題なの?

第一のシナリオ:接続は、(OK)WIFIの上に常にある

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

第二のシナリオ:接続は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から無線LANへの接続スイッチ(OK)

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

私の推測は、デフォルトでは、HttpURLConnectionは3Gと比較して優れた接続タイプと考えています。したがって、接続がWIFIから3Gに切り替わると、HttpURLConnectionは3Gを認識せずにWIFIを使用して接続しようとします。一方、HttpURLConnectionでは、WIFIがより良い接続タイプであるため、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) 
{ 

} 

答えて

2

をあなたを助けることができるかどうか、いくつかのデフォルトのタイムアウトでHTTP接続にユーティリティライブラリを一緒に入れている私がなぜわからないが、コードの上にSystem.setProperty("http.keepAlive", "false")を追加して問題を解決します。

Android Developers Blog(androids-http-clients)によると、HttpURLConnectionにはFroyo以前のバグがあり、上記のように接続プールを無効にすることで解決できます。しかし、私はジンジャーブレッドを使用しているので、なぜHttpURLConnectionが私のアプリケーションで依然として不正行為をしているのか分かりません。

他の人へ:他にも説明がある場合は、私の投稿を編集することを躊躇しないでください。

1

あなたは無線LANに接続し、それが3Gにスイッチバックするとき、あなたが見ています任意の接続ドロップの例外?

私が知っているところでは、無線LANで接続を開くと、同じ接続を3Gに使用できません。既存の接続を解体し、3Gで新しい接続を確立する必要があります。

あなたの要求に接続タイムアウトを設定していないため、接続が切断されたときにHttpUrlConnectionがUR接続が失われたことを認識するまでに時間がかかるために発生する可能性があります。

私はこれがとにかく

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

+0

ありがとう、Naresh!私の接続は自動的にWiFiから3Gに切り替わらないことに注意してください。 3Gを有効にする前に手動でWiFiを無効にしています。私が知る限り、私は以前の接続を再利用していません。私は常にhttpsURLConnection =(HttpURLConnection)((新しいURL(url))を呼び出しています。openConnection()); Webサービスに接続する前にしたがって、私の接続は常にWebサービスに接続しようとする前に更新されます。また、3GからWiFiに切り替えると、Webサービスに接続できます。私がWiFiから3Gに切り替えると、それは機能しません。 – Arci

+0

もう1つ注意してください(HttpURLConnection)((新しいURL(url))。openConnection())は新しい接続を再確立していますか?それとも、それはまだ私の古い接続を別のURLだけで使用していますか? – Arci

+0

はい..itは新しい接続を確立します。また、私はあなたがHttpUrlCOnnectionよりも便利で設定可能な、アンドロイドでHttpClientに切り替えることをお勧めします – Naresh

関連する問題