Я получил, AsyncTask
что должен проверить доступ к сети по имени хоста. Но время doInBackground()
никогда не истекает. У кого-нибудь есть подсказка?
public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> {
private Main main;
public HostAvailabilityTask(Main main) {
this.main = main;
}
protected Boolean doInBackground(String... params) {
Main.Log("doInBackground() isHostAvailable():"+params[0]);
try {
return InetAddress.getByName(params[0]).isReachable(30);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
protected void onPostExecute(Boolean... result) {
Main.Log("onPostExecute()");
if(result[0] == false) {
main.setContentView(R.layout.splash);
return;
}
main.continueAfterHostCheck();
}
}
android
networking
asynchronous
Видар Вестнес
источник
источник
if(Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8").waitFor()==0) ...
. Смотрите мой ответ для более хорошей реализации этого. Кстати, принятый ответ (и многие другие здесь) просто проверьте подключение к сети , а не к Интернету.Ответы:
Сетевое подключение / доступ в интернет
isConnectedOrConnecting()
(используется в большинстве ответов) проверяет любое сетевое соединениеA) Пинг сервера (легко)
+
может работать в главном потоке-
не работает на некоторых старых устройствах (Galays S3 и т. д.), он блокируется некоторое время, если интернет недоступен.Б) Подключение к сокету в интернете (дополнительно)
+
очень быстрый (в любом случае), работает на всех устройствах, очень надежный-
не может работать в потоке пользовательского интерфейсаЭто работает очень надежно на каждом устройстве и очень быстро. Он должен выполняться в отдельной задаче (например,
ScheduledExecutorService
илиAsyncTask
).Возможные вопросы
Это действительно достаточно быстро?
Да, очень быстро ;-)
Нет ли надежного способа проверить интернет, кроме тестирования чего-либо в интернете?
Не настолько, насколько я знаю, но дайте мне знать, и я отредактирую свой ответ.
Что делать, если DNS не работает?
Google DNS (например
8.8.8.8
) является крупнейшим общедоступным DNS в мире. По состоянию на 2013 год он обслуживал 130 миллиардов запросов в день. Скажем так, ваше приложение, вероятно, не будет темой дня.Какие разрешения требуются?
Просто доступ в интернет - сюрприз ^^ (Кстати, вы когда-нибудь задумывались над тем, как некоторые из предложенных здесь способов могли бы иметь хоть какой-то удаленный признак доступа в интернет без этого разрешения?)
Дополнительно:
AsyncTask
пример с одним выстреломДополнительно:
RxJava/RxAndroid
Пример с одним выстрелом (Котлин)источник
Если устройство находится в режиме полета (или, по-видимому, в других ситуациях, когда нет доступной сети),
cm.getActiveNetworkInfo()
будетnull
, поэтому вам нужно добавитьnull
проверку.Модифицировано ( решение Эдди ) ниже:
Также добавьте следующее разрешение
AndroidManifest.xml
:Еще один маленький момент: если вам абсолютно необходимо сетевое соединение в данный момент времени, то лучше использовать
netInfo.isConnected()
, чемnetInfo.isConnectedOrConnecting
. Я думаю, что это зависит от индивидуального варианта использования.источник
context.getSystemService
или он не работает. Я получил свою подсказку здесь androidhive.info/2012/07/…Не нужно быть сложным. Самый простой и основополагающий способ - использовать
ACCESS_NETWORK_STATE
разрешение и просто подключить метод.Вы также можете использовать,
requestRouteToHost
если у вас есть конкретный хост и тип соединения (Wi-Fi / мобильный).Вам также понадобится:
в вашем андроид манифесте.
источник
context.getSystemService
или он не работает. Я получил свою подсказку здесь androidhive.info/2012/07/…getAllNetworkInfo()
устарела на уровне API 29Чтобы приступить
getActiveNetworkInfo()
к работе, необходимо добавить в манифест следующее.источник
getActiveNetworkInfo()
не рекомендуется использовать API уровня 29.Посмотрите на класс ConnectivityManager. Вы можете использовать этот класс для получения информации об активных соединениях на хосте. http://developer.android.com/reference/android/net/ConnectivityManager.html
РЕДАКТИРОВАТЬ: Вы можете использовать
или
и проанализировать перечисление DetailState возвращенного объекта NetworkInfo
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Чтобы узнать, можете ли вы получить доступ к хосту, вы можете использовать
Очевидно, я использую Context.getSystemService (Context.CONNECTIVITY_SERVICE) в качестве прокси, чтобы сказать
источник
проверь этот код ... у меня сработало :)
Затем я определяю обработчик:
... и запустить тест:
источник
Найден и изменен (!) По этой ссылке :
В своем файле манифеста добавьте как минимум:
Возможно, у вас уже есть разрешение на доступ в Интернет, если вы обращаетесь к нему. Тогда логическая функция, которая позволяет проверять наличие соединения:
источник
Я сделал этот код, он самый простой и просто логический. спрашивая
if(isOnline()){
Вы получаете, если есть соединение и если он может подключиться к странице код состояния
200
(стабильное соединение).Обязательно добавьте правильные
INTERNET
иACCESS_NETWORK_STATE
разрешения.источник
Это работает для меня:
Чтобы проверить доступность сети:
Чтобы проверить доступ в интернет:
источник
Там больше, чем один способ
Во-первых, самый короткий, но неэффективный способ
Требуется только разрешение состояния сети
Тогда этот метод,
Как видно в ответах
ConnectivityManager
, это решение, я просто добавил его в методе, это упрощенный метод, который все используют,ConnectivityManager
возвращает значение true, если есть доступ к сети, а не доступ к Интернету, то есть если ваш WiFi подключен к маршрутизатору, но у маршрутизатора нет Интернета, то это возвращает true, проверяет наличие соединенияВо-вторых, эффективный способ
Состояние сети и интернет-разрешения необходимы
Тогда этот класс,
Вызов
CheckInternetAsyncTask
Некоторые объяснения: -
Вы должны проверить интернет
AsyncTask
, в противном случае он может броситьandroid.os.NetworkOnMainThreadException
в некоторых случаяхConnectivityManager
используется для проверки доступа к сети, если true отправляет запрос (Ping)Запрос на отправку
http://clients3.google.com/generate_204
, Этот известный URL-адрес, как известно, возвращает пустую страницу с HTTP-статусом 204, это быстрее и эффективнее, чемhttp://www.google.com
, прочитайте это . если у вас есть веб-сайт, то предпочтительнее размещать свой веб-сайт вместо Google, только если вы используете его в приложенииВремя ожидания может быть изменено (20 мс -> 2000 мс), обычно используется 1500 мс
источник
Из всего, что я видел до сих пор, самый короткий и чистый путь должен быть:
PS: Это не пингует какой-либо хост, он просто проверяет состояние соединения, поэтому, если у вашего роутера нет подключения к интернету и ваше устройство подключено к нему, этот метод вернет true, хотя у вас нет интернета.
Для реального теста я бы порекомендовал выполнить запрос HttpHead (например, на www.google.com) и проверить статус, если его 200 в порядке, все в порядке и ваше устройство подключено к Интернету.
источник
Вот метод, который я использую:
Еще лучше проверить, что он «подключен»:
Вот как использовать метод:
Требуется разрешение:
https://stackoverflow.com/a/16124915/950427
источник
Один важный случай использования на мобильных устройствах, чтобы убедиться, что фактическое соединение существует. Это общая проблема, когда мобильный пользователь входит в сеть Wifi с «Captive Portal», в который ему необходимо войти. Я использую эту функцию блокировки в фоновом режиме, чтобы убедиться, что соединение существует.
источник
Вы можете перебрать все сетевые подключения и проверить, есть ли хотя бы одно доступное подключение:
источник
Для меня не было хорошей практикой проверять состояние соединения в классе Activity, потому что
должен быть вызван там, или вам нужно передать ваш экземпляр Activity (контекст) в класс обработчика соединения, чтобы можно было там проверить состояние соединения. Когда нет доступного соединения (wifi, сеть), я ловлю исключение UnknownHostException :
Таким образом, я могу обработать этот случай вместе с другими случаями в том же классе (мой сервер всегда отвечает обратно строкой json)
источник
Это работает для меня. Попробуйте это.
источник
Этот метод дает вам возможность для очень быстрого метода (для обратной связи в реальном времени) или более медленного метода (для однократных проверок, которые требуют надежности)
источник
Я использую этот код вместо InetAddress:
источник
Нетрудно проверить состояние сети Android / интернет-соединения. Следующий
DetectConnection
класс поможет вам проверить этот статус:Для получения более подробной информации посетите Как проверить состояние сети Android / подключения к Интернету
источник
Лучший подход:
источник
Ниже приведен код из моего
Utils
класса:источник
источник
Вы можете использовать этот метод для определения доступности сети
источник
Я применил решение, предоставленное @Levit, и создал функцию, которая не будет вызывать дополнительный запрос Http.
Это решит ошибку
Unable to Resolve Host
Теперь назовите это как,
источник
Это описано в документации для Android http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
источник
Я просмотрел все ответы и нашел свой собственный ответ, который сначала проверяет, доступен ли Интернет и доступен ли он, а затем проверяет, активен он или нет.
Я включил все необходимые методы и классы для проверки активного подключения к Интернету.
NetworkUtils.class
Вы можете проверить, активен ли Интернет, используя следующий код:
источник
Очень важно проверить, есть ли у нас связь с isAvailable () и возможно ли установить соединение с isConnected ()
и вы можете определить тип активной сети WiFi :
или мобильный Móvil :
не забудьте разрешения:
источник
Котлин и сопрограммы
Я поместил функцию в
ViewModel
, который имеетviewModelScope
. Используя наблюдаемое,LiveData
я информирую деятельность о связи.ViewModel
Деятельность
источник
Просто создайте следующий класс, который проверяет подключение к интернету:
Этот класс просто содержит метод, который возвращает логическое значение состояния соединения. Поэтому, если говорить простым языком, если метод находит допустимое соединение с Интернетом, возвращаемое значение равно
true
, иначе,false
если действительное соединение не найдено.Следующий метод в MainActivity затем вызывает результат из ранее описанного метода и предлагает пользователю действовать соответствующим образом:
В приведенном выше коде, если результат ложный (поэтому нет подключения к Интернету, пользователь перенаправляется на панель Wi-Fi Android, где ему предлагается подключиться к точке доступа Wi-Fi).
источник
Обновление 29/06/2015 Если вы используете Xamarin.Android и хотите проверить подключение, вы можете использовать пакет Nuget, который предоставит вам эту функциональность на нескольких платформах. Хорошие кандидаты здесь и здесь . [Конец обновления]
Приведенные выше ответы довольно хороши, но все они на Java, и почти все они проверяют наличие соединения. В моем случае мне нужно было соединение с определенным типом соединения, и я работаю на Xamarin.Android. Более того, я не передаю ссылку на контекст моей деятельности на аппаратном уровне, я использую контекст приложения. Так что вот мое решение, если кто-то придет сюда с похожими требованиями. Я не прошел полное тестирование, но обновлю ответ, как только я закончу тестирование
источник