Android: переключение 3G на WIFI в центре приложения = потеря подключения к сети - PullRequest
5 голосов
/ 03 декабря 2010

У меня неприятная проблема с HTC Legend (Android 2.2).Не видя этой проблемы на Xperia, Galaxy, Nexus и т. Д.

Когда я запускаю свое приложение по соединению 3G, извлекаю некоторые данные, затем захожу в настройки телефона и включаю WIFI, телефон автоматически получает соединение WIFI, котороепредпочтительнее 3G.Проблема в том, что, как только я снова переключаюсь на приложение, оно теряет все сетевое соединение и не может подключиться ни к чему.Однако другие приложения, такие как веб-браузер, например, не имеют проблем с использованием нового соединения Wi-Fi.Ping отлично работает с оболочки телефона.

Если я подожду достаточно долго (например, 15 минут), кажется, сетевой стек восстанавливается автоматически, и мое приложение может снова устанавливать сетевые подключения.Конечно, эта задержка недопустима.

Можно ли программно перезапустить сетевой стек?Я создаю новый java.net.HttpURLConnection каждый раз, но он все еще истекает после того, как WIFI был получен.

Спасибо

Код:

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

И 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)

Ответы [ 2 ]

1 голос
/ 24 января 2011

Я вижу, что у вас есть SocketTimeoutException, возможно, вы можете перехватить это исключение и подключиться с помощью нового сокета?

0 голосов
/ 14 ноября 2012

Существует ошибка , из-за которой система повторно использует старые http-соединения .Установка системного свойства http.keepAlive в false должна решить проблему:

System.setProperty("http.keepAlive", "false");
...