2015-04-02 8 views
2

Итак, это довольно откровение - факт, что Android SDK, похоже, не имеет надежного способа проверить доступ в Интернет.Проверка Android на Android (не проверка сети)

Позвольте мне уточнить.

Android документация & большинство онлайн образцы используют подход, подобный найденному здесь: https://stackoverflow.com/a/4009133/980917

что-то похожее на:

public boolean isOnline() { 
    ConnectivityManager cm = 
     (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    return netInfo != null && netInfo.isConnectedOrConnecting(); 
} 

Однако - это просто проверяет, если вы подключены к сети и не гарантируйте, что вы сможете добраться до интернета.

Для тех, кто этого не знает, его довольно легко воспроизвести, отсоединив кабель «IN» Ethernet от вашего маршрутизатора или подключив к любому Wi-Fi, который не подключен к Интернету.

ИЗВЕСТНЫЕ ДОРАБОТКИ:

1) Попробуйте достичь веб-сайт: https://stackoverflow.com/a/5803489/980917 Это проблематично, как управление потребности Thread.

2) Попробуйте выполнить проверку DNS в Google: https://stackoverflow.com/a/27312494/980917 Не нужно обертывать в поток, но будет заморозить интерфейс.

Что я ищу:

В идеале я хотел бы иметь чек Интернет как простой статический метод в служебный класс, который может быть вызван из пользовательского интерфейса или код бизнес-логики. Из-за этого вышеупомянутые решения действительно не работают хорошо, так как требуют дополнительных накладных расходов в классе caller для управления потоками.

Есть ли способ получить надежную проверку через Интернет в Android без загрязнения класса вызывающего абонента с помощью кода управления потоками?

Спасибо.

ответ

1

Я сделал special class for this с набором статических mehods. Он хорошо знает и показывает в вашем методе вопроса, чтобы определить, доступна ли сеть. Он также имеет способ проверить, доступен ли целевой сервер/хост через эту сеть - checkIsServerReachable(). Однако, поскольку его сетевая задача не может быть запущена в потоке пользовательского интерфейса, так что единственный способ здесь - использовать AsyncTask, Thread или callback.

+0

Спасибо за это - попробуем. Хорошая реализация известных методов. Я начинаю понимать, что мне нужно будет сделать рефакторинг, чтобы все проверки Интернета не выполнялись в потоке пользовательского интерфейса. – AlexVPerl

+0

Привет, снова - я интегрирую класс вспомогательного подключения, есть ли у вас пример быстрого использования, который вы можете предоставить? благодаря! – AlexVPerl

+0

Спасибо, я закончил с помощью checkHostByConnection() - это работало лучше всего из решений. – AlexVPerl

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

  • Нет связанных вопросов^_^