или нет?
Ну смотря что мне нужно. Если мне нужен сервис яндекса, я буду пинговать именно его. Так как 8888, ни какого отношения к нему не имеет, в прочем, как и к основному гуглу.
нет, стоп, ты же сам уже отказался разговаривать о том, что тебе нужно, ты настаиваешь весь день на формулировке именно "просто проверить подключение к сети, а не к какому-то серверу", что с этой формулировкой случилось? проехали?
Ну потому, что я вел вопрос в контексте, почему разработчики не дали нам возможность, гарантированно проверить, что пользователь, не запретил нашему приложению доступ в сеть. Фаерволом, отключением кабеля и тд. Мне нужен был сам факт. А если речь пошла о реальном проекте, то он конечно с чем то работает и нам логично проверять именно доступность этого ресурса.
доступ В КАКУЮ сеть?
Вы получите ошибку под определенном кодом
Да понял я уже про это. Что нет понятия конкретной сети. Но они же тем не менее сообщают, что есть подключение без доступа к интернету. Вот и дали бы разрабам такую возможность.
так такая возможность есть, мы же обсуждали это сегодня, ты пропустил? NetworkCapabilities.NET_CAPABILITY_INTERNET
Да, видимо зачитался и из головы контекст частично выпал.
короче, смотри как это на практике делается. как ты уже понял, обычно тебя волнует доступ до твоего нужного ресурса, а не до всей сети в целом. поэтому конечно люди умеют гонять тестовые запросы до своего бэкэнда. но главное тут в том, что даже такая проверка не спасает тебя вообще ни от чего. вот твой сервер пинговался, а пока ты сформировал к нему уже собственно нужный тебе запрос - сервер уже умер/пользователь въехал в тоннель/на счету у пользователя кончились деньги и твое приложение осталось без доступа до твоего сервера. а ты в этот момент уже в сокет пишешь/читаешь. в этот момент происходит следующее: либо чтение/запись зависнет до таймаута, а потом кинет эксепшен, либо сразу вылетит эксепшен, типа, сорян, ошибка ввода-вывода. и вот этот эксепшен ты обязан в приложении обрабатывать в любом случае, не важно, сделал ты до этого проверку на наличие подключения или нет. по результатам обработки такого эксепшена ты обычно решаешь тут же попробовать снова сделать нужный запрос. но и он умирает точно так же. поэтому ты решаешь подождать (не спамить же непрерывно, не жечь же трафик и батарейку) и спустя, например, 5 секунд попробовать еще раз. А потом спустя 10. 20. 40. минуту. пять минут. Это называется "exponential backoff policy". Но что делать, если твоя экспонента уже накапала так, что запросы происходят раз в полчаса, а интернет вдруг появился? Вот для этого и существуют сервисы типа ConnectivityManager или NetworkCapabilities: они позволяют тебе подписаться (листенером) на событие "о, дали сеть" или там "сменился вайфай" или там "переключились с мобильной связи на вайфай". И тогда можно совершить, например, внеурочную попытку снова сделать нужный запрос, не дожидаясь таймаута, ведь у нас есть определенные основания полагать, что ситуация изменилась. Итого: - обязательная обработка ошибки ввода-вывода - экспоненциальная задержка повторных попыток, ограниченная сверху - подписка на события сетевых сервисов И вот это вещи, которые тебе придется делать в любом случае, не важно, сделал ты перед этим проверку доступности сети, или нет. А главное, что вот в этом раскладе тебе "проверка доступности сети" вообще не потребуется - её роль выполняет твой первоначальный запрос. Понятно?
+ отличная информация. Большое спасибо за науку. Сеть очень интересна мне и эта неделя посвящена именно ей.
Evgeny Chesnokov рейтинг 18 (+1).
Как говорится разжевал, переварил, и высрал)))
Обсуждают сегодня