Android Internet Check (не проверка сети)
Так что это настоящее открытие - тот факт, что Android SDK, похоже, не имеет надежного способа проверки доступа в Интернет.
Позвольте мне уточнить.
В документации Android и большинстве онлайн-примеров используется подход, аналогичный тому, который можно найти здесь: /questions/10600949/kak-proverit-dostup-v-internet-na-android-inetaddress-nikogda-ne-istekaet/10600968#10600968
Что-то похожее:
public boolean isOnline() {
ConnectivityManager cm =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
Однако - это просто проверяет, подключены ли вы к сети, и не гарантирует, что вы можете подключиться к Интернету.
Для тех, кто не знает об этом, его довольно легко воспроизвести, отключив Ethernet-кабель "IN" от маршрутизатора или подключившись к любому Wi-Fi, который не подключен к Интернету.
ИЗВЕСТНЫЕ РАБОТЫ:
1) Попытайтесь зайти на веб-сайт: /questions/10600949/kak-proverit-dostup-v-internet-na-android-inetaddress-nikogda-ne-istekaet/10600993#10600993 Это проблематично, поскольку необходимо управление потоками.
2) Попробуйте проверить связь с DNS Google: /questions/10600949/kak-proverit-dostup-v-internet-na-android-inetaddress-nikogda-ne-istekaet/10600953#10600953 Не нужно переносить в поток, но пользователь замораживает интерфейс.
Что я ищу:
В идеале я хотел бы, чтобы проверка через Интернет представляла собой простой статический метод в служебном классе, который можно вызывать из пользовательского интерфейса или кода бизнес-логики. Из-за этого вышеприведенные решения не очень хорошо работают, так как требуют дополнительных издержек в классе вызывающего для обработки управления потоками.
Есть ли способ получить надежную проверку интернета в Android без загрязнения класса вызывающего абонента кодом управления потоками?
Благодарю.
1 ответ
Я сделал для этого специальный класс с набором статических методов. Он хорошо известен и показан в вашем вопросе, чтобы определить, доступна ли сеть. У этого также есть метод, чтобы проверить, достижим ли целевой сервер / хост через эту сеть - checkIsServerReachable(). Однако, поскольку это сетевая задача, его нельзя запускать в потоке пользовательского интерфейса, поэтому единственный способ здесь - использовать AsyncTask, Thread или callback.