2015-05-03 2 views
0

Итак, я сравниваю, какую из двух функций я должен использовать ниже. Я знаю, что один проверяет, подключен ли телефон к интернету или чекам, если у вас есть соединение вообще? Работает ли лучше, чем другой, что делает один против другого? Они делают то же самое?Проверка подключения к Интернету в Android (сравнение функций)

Функция 1:

public static boolean hasActiveInternetConnection(Context context) { 
    if (isNetworkAvailable(context)) { 
     try { 
      HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); 
      urlc.setRequestProperty("User-Agent", "Test"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(1500); 
      urlc.connect(); 
      return (urlc.getResponseCode() == 200); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "Error checking internet connection", e); 
     } 
    } else { 
     Log.d(LOG_TAG, "No network available!"); 
    } 
    return false; 
} 

Функция 2:

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
    = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null; 
} 

ответ

2

Во-первых, функция 1. требует разрешения

<uses-permission android:name="android.permission.INTERNET"/> 

Функция 2. потребности

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

функции 1.

  • Трансферы фактические данные (плохие)
  • Не работает, если DNS-серверы мертвы
  • Не работает, если Google вниз (небольшой шанс, но не 0%)
  • На медленных сетях мобильной связи, могут (очень плохо)

На практике вы должны использовать только функцию 2. и правильно обрабатывать запрошенные запросы ВАШ сервер

+1

Все ответы были хорошими, выбрали это, потому что он упомянул лучшие практики .... Спасибо всем. –

+0

Спасибо. Наслаждаться. –

1

Функция 2 имеет более четкую декларативно, вы запрашиваете наличие сети а не делать шаги, чтобы проверить его (как и в функции 1) , Кроме того, Android 5.0 предоставляет новые мультисервисные API, позволяющие вашему приложению динамически сканировать доступные сети с определенными возможностями и устанавливать соединение с ними, см. Wireless and Connectivity

+0

Я попытался +1! Это довольно круто. Вы уже реализовали его, если так, было ли трудно? –

+0

Я еще не использовал этот API, но он не выглядит сложным для реализации :) – Max77

1

Я обычно использую оба ... как в вашем случае (isNetworkavailable & & hasActiveInternetConnection)

первый метод проверяет, есть ли связь вообще (например, не будет ни одного, если телефон находится в режиме самолета), и если это, кажется, работает второй метод проверяет, есть на самом деле может быть данные, полученные через это соединение

1

По моему мнению, использование function2 первым. Если ему удастся вызвать функцию1. ;-)
Функция2 будет следить за тем, чтобы с устройства было установлено какое-либо соединение. Если да, то функция2 будет пинговать некоторые uri, google в этом примере. Это полезно в ситуации, когда устройство может быть подключено к некоторому Wi-Fi, но по-прежнему возникают проблемы при подключении и т. Д.

Единственная проблема, которая иногда может возникнуть, - это в случае очень медленного соединения. Даже если соединение доступно, то можно сказать, что соединение не доступно

Смежные вопросы