Переключение с соединения WiFi на 3g приводит к зависанию соединения?

У меня есть приложение, которое подключается к веб-службе. Я могу подключаться к веб-сервису любое количество раз без каких-либо проблем, используя WIFI или 3G, при условии, что я остаюсь верным своему типу подключения в течение жизненного цикла моего приложения. Это если я не переключаюсь с WIFI на 3G. Если я переключаюсь с WIFI на 3G, я больше не могу получить ответ. Мое соединение просто продолжает ждать ответа.

Я попробовал 4 сценария ниже. У меня проблема только с 3-м сценарием. В чем может быть проблема?

1-й сценарий: подключение всегда по WIFI (в порядке)

  1. Приложение подключается к веб-службе с помощью WIFI.
  2. Ответ успешно получен.
  3. Приложение снова подключается к веб-службе с помощью WIFI.
  4. Ответ успешно получен.

2-й сценарий: соединение всегда на 3G (в порядке)

  1. Приложение подключается к веб-службе с помощью WIFI.
  2. Ответ успешно получен.
  3. Приложение снова подключается к веб-службе с помощью WIFI.
  4. Ответ успешно получен.

3-й сценарий: соединение переключается с WIFI на 3G (нет ответа)

  1. Приложение подключается к веб-службе с помощью WIFI.
  2. Ответ успешно получен.
  3. Связь переключилась на 3G. Wi-Fi отключен. 3G включен.
  4. Приложение снова подключается к веб-службе, используя 3G.
  5. Нет ответа или получена ошибка. Приложение продолжает ждать ответа. Последний журнал отображался до вызова getResponseCode.

4-й сценарий: подключение переключается с 3G на WIFI (в порядке)

  1. Приложение подключается к веб-службе с помощью 3G.
  2. Ответ успешно получен.
  3. Связь переключилась на WIFI. 3G отключен. Wi-Fi включен.
  4. Приложение снова подключается к веб-службе с помощью WIFI.
  5. Ответ успешно получен.

Я предполагаю, что по умолчанию HttpURLConnection считает WIFI лучшим типом подключения по сравнению с 3G. Поэтому, когда соединение переключается с WIFI на 3G, HttpURLConnection отказывается подтверждать 3G и по-прежнему пытается подключиться с помощью WIFI. С другой стороны, HttpURLConnection позволяет переключаться с 3G на WIFI, так как WIFI является лучшим типом подключения. Я прав с этим? Если да, то как разрешить переключение с WIFI на 3G?

Ниже приведен фрагмент моего кода: (Я вызываю его каждый раз, когда подключаюсь к веб-службе.)

//open new connection
httpsURLConnection = (HttpURLConnection) ((new URL(url)).openConnection());
httpsURLConnection.setDoInput(isDoInput);
httpsURLConnection.setDoOutput(isDoOutput);

try
{
    //supply parameters
    OutputStreamWriter wr = new OutputStreamWriter(httpsURLConnection.getOutputStream());
    wr.write(data);
    wr.flush();

    if(httpURLConnection != null)
    {
        if (httpsURLConnection.getResponseCode() == HttpsURLConnection.HTTP_OK) //connection hangs here
        {
            //some code
        }
        else
        {
            //some code
        }
    }

}catch(Exception e)
{

}

person Arci    schedule 20.04.2012    source источник


Ответы (2)


Я не уверен, почему, но добавление System.setProperty("http.keepAlive", "false") в код решает проблему.

Согласно блогу разработчиков Android (http://android-developers.blogspot.ca/2011/09/androids-http-clients.html), HttpURLConnection имеет ошибку до Froyo, и ее можно решить, отключив пул соединений, как указано выше. Однако я использую Gingerbread, поэтому я не уверен, почему HttpURLConnection все еще работает неправильно в моем приложении.

Другим: если вы можете предоставить дополнительные пояснения, не стесняйтесь редактировать мой пост.

person Arci    schedule 23.04.2012

когда вы подключаетесь к Wi-Fi, а он снова переключается на 3G, видите ли вы какие-либо исключения обрыва соединения?

Насколько я знаю, если вы открываете соединение по Wi-Fi, это же соединение нельзя использовать для 3G. вам нужно разорвать существующее соединение и восстановить новое соединение на 3G.

Я предполагаю, что ваша проблема может быть связана с тем, что вы не установили время ожидания соединения для своих запросов, и в результате, когда соединение обрывается, HttpUrlConnection требуется много времени, чтобы понять, что ваше соединение потеряно.

Я собрал служебные библиотеки для http-соединений с некоторыми тайм-аутами по умолчанию, посмотрите, может ли это вам помочь.

https://github.com/nareshsvs/android-libraries

person Naresh    schedule 20.04.2012
comment
Спасибо, Нареш! Обратите внимание, что мое соединение не переключается автоматически с WiFi на 3G. Я вручную отключаю свой WiFi перед включением 3G. Насколько я знаю, я не использую свое предыдущее соединение повторно. Я всегда звоню httpsURLConnection = (HttpURLConnection) ((новый URL(url)).openConnection()); перед подключением к веб-службе. Таким образом, мое соединение всегда обновляется, прежде чем оно попытается подключиться к веб-службе. Кроме того, если я переключаюсь с 3G на WiFi, я все еще могу подключиться к веб-службе. Не работает только при переключении с WiFi на 3G. - person Arci; 20.04.2012
comment
С другой стороны, вызов (HttpURLConnection) ((новый URL(url)).openConnection()) означает, что я восстанавливаю новое соединение? Или он по-прежнему использует мое старое соединение только с другим URL-адресом? - person Arci; 20.04.2012
comment
да .. он устанавливает новое соединение. Также я бы посоветовал вам переключиться на HttpClient в Android, что более полезно и настраивается, чем HttpUrlCOnnection. - person Naresh; 20.04.2012
comment
Спасибо! HttpClient хорош для Eclair и Froyo, но HttpURLConnection предпочтительнее для Gingerbread и выше. Хотя HttpClient более настраиваемый, HttpURLConnection работает быстрее. Кстати, я уже решил свою проблему. :) System.setProperty(http.keepAlive, false) решает эту проблему. Я не знаю почему. - person Arci; 23.04.2012