Android: 3G a WIFI cambiar mientras que en el medio en la app = pérdida de conectividad de red

Estoy corriendo en un problema molesto con HTC Legend (Android 2.2). No viendo este problema en Xperia, Galaxy, Nexus, etc.

Cuando lanzo mi aplicación en una conexión 3G, buscar algunos datos, luego entrar en la configuración del teléfono y habilitar WIFI, el teléfono obtiene automáticamente una conexión WIFI que es favorecida en 3G. El problema es que, una vez que vuelvo a la aplicación, parece que ha perdido toda la conectividad de red y no puede conectarse a nada. Sin embargo, otras aplicaciones, como el Navegador Web, por ejemplo, no tienen ningún problema con 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 volver a realizar conexiones de red. Por supuesto, este retraso es inaceptable.

¿Hay una manera de volver a init la pila de la red de forma programática? Creo una nueva java.net.HttpURLConnection cada vez, con todo todavía épocas una vez que el WIFI se ha adquirido.

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) 

Veo que tiene una SocketTimeoutException, tal vez usted puede capturar esta excepción y conectar con un nuevo socket?

Hay un error que hace que el sistema reutilice conexiones HTTP antiguas . Configurar la propiedad del sistema http.keepAlive a false debería resolver el problema:

 System.setProperty("http.keepAlive", "false"); 
  • ¿Permitir que dos dispositivos se vean en Android usando la interfaz wifi?
  • Comprobar WiFi y GPS isConnected o no en Android?
  • Aplicaciones de Android, comunicación con un dispositivo conectado al puerto USB
  • Android - detección si wifi es WEP, WPA, WPA2, etc. programáticamente
  • Conexión WiFi a través de Android
  • Android: Fuerza los datos que se envían a través de radio vs WiFi
  • Aplicación de Android que no se conecta a Wifi, pero funciona bien en 3G compartida a través de Wifi
  • Aumento de la velocidad de análisis WiFi
  • Establecer IP estática y pasarela programáticamente en Android 6.x (Marshmallow)
  • Cambiar el rango de IP WiFi? Forzar IPv6 en Android WiFi-Direct?
  • Ubicación por dirección IP en interiores
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.