2010-12-03 28 views
5

HTC Legend(Android 2.2)で迷惑な問題が発生しています。Android:3GとWIFIの切り替えはアプリの途中で切り替える=ネットワーク接続が失われる

私が3G接続でアプリを起動すると、データを取得して電話設定に入り、WIFIを有効にすると、携帯電話は自動的にお気に入りのWIFI接続を取得します3G上で問題は、一度私は再びアプリケーションに切り替えると、それはすべてのネットワークconnectivtyを失ったと何かに接続することができないように見えます。しかし、例えばWebブラウザのような他のアプリでは、新しいWifi接続の使用に問題はありません。 Pingは電話のシェルからうまく機能します。

長い時間(たとえば15分)待機すると、ネットワークスタックが自動的に修復されてしまい、アプリがネットワーク接続をもう一度行うことができます。もちろん、この遅延は容認できません。

プログラムによってネットワークスタックを再初期化する方法はありますか?私は毎回新しいjava.net.HttpURLConnectionを作成しますが、WIFIが取得されるとタイムアウトします。

おかげ

コード:私はあなたがしてSocketTimeoutExceptionを持って見

byte[] response = null; 
    HttpURLConnection connection = null; 
    int responseCode = -1; 

    // check the cache first 
    String readyResponse = ResponseCache.getInstance().get(getUrl()); 
    if (readyResponse != null) { 
     Log.d(LOG_TAG, "Returning CACHED server response for " + getUrl()); 
     return readyResponse.getBytes(); 
    } 

    try { 

     URL url = new URL(getUrl()); 
     Log.i(LOG_TAG, "Sending Request: " + url.toExternalForm()); 

     connection = (HttpURLConnection) url.openConnection(); 
     connection.setUseCaches(false); 
     connection.setDoOutput(true); 
     connection.setDoInput(true); 
     connection.setConnectTimeout(ApplicationConfiguration.HTTP_CONNECT_TIMEOUT); 
     connection.setReadTimeout(ApplicationConfiguration.HTTP_READ_TIMEOUT); 

     if (BuildType.getHTTPMethod() == BuildType.METHOD_GET) 
     { 
      connection.setRequestMethod("GET"); 
     } 
     else 
     { 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

      String body = getParameters(); 
      connection.setRequestProperty("Content-Length", Integer.toString(body.length())); 

      OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream()); 
      wr.write(getParameters()); 
      wr.flush(); 
     } 



     connection.connect(); 

     responseCode = connection.getResponseCode(); 

そして、スタックトレース

E/xxx.yyy.zzz( 927): java.net.SocketTimeoutException: Read timed out 
E/xxx.yyy.zzz( 927): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeread(Native Method) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.access$200(OpenSSLSocketImpl.java:55) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:532) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readln(HttpURLConnectionImpl.java:1279) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.readServerResponse(HttpURLConnectionImpl.java:1351) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.sendRequest(HttpURLConnectionImpl.java:1339) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1656) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:1374) 
E/xxx.yyy.zzz( 927): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:117) 
E/xxx.yyy.zzz( 927): at xxx.yyy.zzz.executeRequest(zzz.java:95) 

答えて

1

、おそらくあなたは、この例外をキャッチし、新しいソケットを使用して接続することができますか?

+0

はい、私の解決策は、あなたの提案に類似していた、加えて、私は非常に低い値にsetConnectTimeout()とsetReadTimeout()を入れて、ただ叩いておきます有効なソケットが取得されるまでURLに追加します。 – Saideira

関連する問題