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

Имам приложение, което се свързва с уеб услуга. Мога да се свързвам с уеб услугата произволен брой пъти без проблем с помощта на WIFI или 3G, при условие че оставам верен на моя тип връзка по време на жизнения цикъл на моето приложение. Това е, ако не превключа от WIFI към 3G. Ако превключа от WIFI към 3G, вече не мога да получа отговор. Връзката ми просто продължава да чака отговор.

Опитах 4 сценария по-долу. Имам проблем само с третия сценарий. Какъв може да е проблема?

Първи сценарий: Връзката винаги е на WIFI (ОК)

  1. Приложението се свързва с уеб услуга чрез WIFI.
  2. Отговорът беше получен успешно.
  3. Приложението се свързва отново с уеб услуга чрез WIFI.
  4. Отговорът беше получен успешно.

2-ри сценарий: Връзката винаги е в 3G (Добре)

  1. Приложението се свързва с уеб услуга чрез WIFI.
  2. Отговорът беше получен успешно.
  3. Приложението се свързва отново с уеб услуга чрез WIFI.
  4. Отговорът беше получен успешно.

3-ти сценарий: Връзката превключва от WIFI към 3G (без отговор)

  1. Приложението се свързва с уеб услуга чрез WIFI.
  2. Отговорът беше получен успешно.
  3. Връзката беше превключена на 3G. WIFI е деактивиран. 3G е активиран.
  4. Приложението се свързва отново с уеб услуга чрез 3G.
  5. Няма отговор или е получена грешка. Приложението продължава да чака отговор. Последният регистрационен файл беше показан преди извикването на getResponseCode.

4-ти сценарий: Връзката превключва от 3G към WIFI (Добре)

  1. Приложението се свързва с уеб услуга чрез 3G.
  2. Отговорът беше получен успешно.
  3. Връзката беше превключена към WIFI. 3G е деактивиран. WIFI е активиран.
  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

когато осъществите връзка по wifi и тя превключи обратно към 3G, виждате ли изключения за прекъсване на връзката?

Доколкото знам, ако отворите връзка през wifi, същата връзка не може да се използва за 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