Android: 3G к Wi-Fi переключатель пока в середине в приложении = потеря сетевого подключения
-
30-09-2019 - |
Вопрос
Я бегу в раздражающую проблему с HTC Legend (Android 2.2). Не видя этого вопроса о Xperia, Galaxy, Nexus и т. Д.
Когда я запускаю мое приложение в соединении 3G, извлеките некоторые данные, затем перейдите в настройки телефона и включите WiFi, телефон автоматически получает соединение WiFi, которое предпочитает более 3G. Беда в том, что когда я переключаюсь обратно в приложение, он, кажется, проиграл всю сеть Connecivty и не удалось подключиться к чему-либо. Однако другие приложения, такие как веб-браузер, например, не имеют проблеме, используя новое соединение WiFi. 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();
И штабел
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)
Решение
Я вижу, что у вас есть sockettimeoutexception, возможно, вы можете поймать это исключение и подключиться с помощью нового сокета?
Другие советы
Eсть Ошибка, которая вызывает систему повторно использовать старые HTTP-соединениямиОтказ Установка системы системы http.seeparive в false должна решить проблему:
System.setProperty("http.keepAlive", "false");