2010-12-03 18 views
5

Me encuentro con un problema molesto con HTC Legend (Android 2.2). No veo este problema en Xperia, Galaxy, Nexus, etc.Android: conmutador 3G a WIFI mientras está en el medio de la aplicación = pérdida de conectividad de red

Cuando inicio mi aplicación en una conexión 3G, obtengo algunos datos, luego en la Configuración del teléfono y habilito WIFI, el teléfono automáticamente obtiene una conexión WIFI que se ve favorecida por 3G. El problema es que, una vez que vuelvo a la aplicación, parece haber perdido toda la conectividad de red y no puedo conectarme a nada. Sin embargo, otras aplicaciones, como el navegador web, por ejemplo, no tienen problemas para usar la nueva conexión Wifi. Ping funciona bien desde el shell del teléfono.

Si espero lo suficiente, (por ejemplo, 15 minutos), la pila de red parece repararse automáticamente y mi aplicación puede realizar conexiones de red una vez más. Por supuesto, este retraso es inaceptable.

¿Hay alguna forma de volver a iniciar la pila de red mediante programación? Creé una nueva java.net.HttpURLConnection cada vez, pero todavía se agota una vez que se ha adquirido WIFI.

Gracias

Código:

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

Y StackTrace

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) 

Respuesta

1

veo que tiene un SocketTimeoutException, tal vez se puede tomar esta excepción y conectarse a través de un nuevo socket?

+0

sí, mi solución fue similar a su sugerencia, además, puse setConnectTimeout() y setReadTimeout() para valores muy bajos y sólo sigue golpeando en la URL hasta que se obtenga un socket válido. – Saideira

Cuestiones relacionadas