Android: 3G para el interruptor de WIFI, mientras que en el medio de la aplicación = pérdida de conectividad de red

StackOverflow https://stackoverflow.com/questions/4347507

Pregunta

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

Cuando inicio mi aplicación en una conexión 3G, trae algunos datos, y luego ir a la configuración del teléfono y activar Wi-Fi, el teléfono obtiene automáticamente una conexión WIFI que se ve favorecida por 3G. El problema es que, una vez que enciendo de nuevo a la aplicación, parece haber perdido toda connectivty de la red y no puede conectarse a cualquier cosa. Sin embargo, otras aplicaciones, como navegador web, por ejemplo, no tienen ningún problema con la nueva conexión Wifi. Ping funciona bien de la cáscara del teléfono.

Si espero el tiempo suficiente, (por ejemplo, 15 minutos), la pila de red parece repararse a sí mismo de forma automática y mi aplicación es capaz de establecer conexiones de red una vez más. Por supuesto, este retraso es inaceptable.

¿Hay una manera de re-init la pila de red mediante programación? Creo un nuevo java.net.HttpURLConnection cada vez, sin embargo, todavía el tiempo de espera una vez que el WiFi ha sido adquirida.

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)
¿Fue útil?

Solución

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

Otros consejos

Hay una error que hace que el sistema de reutilización de edad http conexiones. Al establecer la propiedad del sistema http.keepAlive a falso debe resolver el problema:

System.setProperty("http.keepAlive", "false");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top