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"); 
  • Hotspot multiplexado en Android
  • Cómo buscar y conectarse a una red wifi específica en Android mediante programación
  • Cómo obtener la dirección IP del router wifi conectado en android mediante programación?
  • ¿Es posible escribir un wifi cracking util para teléfonos Android? Modo de monitor vs Multicast?
  • Notificación de muestra de Android de BroadcastReceiver
  • wifi.getDhcpInfo () en Android devuelve la puerta de enlace IP incorrecta
  • Cómo google home app puede buscar auto wifi contraseña en android?
  • ¿Cómo conectar wifi android a adhoc wifi?
  • Dispositivo inalámbrico ADB no autorizado
  • Android: Determinar el tipo de seguridad de las redes wifi en el rango (sin conectarse a ellos)
  • Iniciar Androids WiFi-Manager mediante el envío de una intención?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.