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.

Другие вопросы по тегам