Постоянное подключение через Wi-Fi и 3G в Android - PullRequest
3 голосов
/ 27 мая 2010

У меня небольшое сомнение относительно процедуры подключения к сети в Android.

Мой сценарий похож на Я подключаюсь к удаленному серверу через TCP, используя 3G. После подключения я включил Wi-Fi. Android перешел на WiFi. И, тем не менее, соединение с сервером остается активным, это означает, что соединение не сбрасывается.

Здесь я хочу знать одну вещь. Когда N / W переключится с 3G на Wi-Fi, устройство Android (или любое другое) также изменит свой IP-адрес? и если он изменит свой IP, будет ли это старое соединение действительным? (значит, на новом IP снова должно быть новое соединение.)

Заранее спасибо.

1 Ответ

2 голосов
/ 31 мая 2010

Насколько я понимаю, IP-адрес изменится. Когда телефон включает WiFi, именно ваш маршрутизатор назначает устройству IP-адрес. Я подозреваю, что Android может перезапускать стек IP (хотя это только предположение), и я не помню, чтобы какой-либо механизм «передачи обслуживания» позволял устройству иметь тот же IP-адрес. Хотя это теоретически возможно, я не уверен, насколько это сложно. :) Кроме того, у Android есть только одна сетевая карта, поэтому он не может сохранить оба IP-адреса. Если он переключается на WiFi, он сохраняет ТОЛЬКО IP-адрес Wi-Fi.

Из моего опыта я заметил, что подобный сценарий потерпит неудачу:

  • Android изначально подключен через 3G
  • Приложение Android отправляет HTTP GET на веб-сервер
  • Android чувствует лучшую WiFi-связь и переключается с 3G

В этом случае запрос GET не выполняется.

Возможные решения:

  • Попробуйте несколько раз: 3 раза (или другое магическое число, но в большинстве случаев у меня работало 3) использование try-catch-repeat должно решить большинство проблем.
  • Используйте код, подобный этому, чтобы проверить подключение к сети и перейти оттуда:

    if(!isOnline()) {
      Log.e("OFFLINEERROR", "No Network Connectivity");
    }
    
    public boolean isOnline() {
      try {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo().isConnectedOrConnecting();         
      } catch(Exception e) {
        //Returned a null so no Internet connection!
        return false;
      }
    }
    
  • Разделите ваши переводы (таким образом, даже если вы потеряете соединение, вы все равно можете завершить перевод).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...