Вот оптимальный способ проверки интернет-соединения. Этот метод выполняет серию проверок «телефон не находится в режиме полета, телефон подключен к сети и т. Д.». Если все проверки вернут true, тогда метод загрузит файл из Интернета и проверит, соответствует ли содержимое ожидаемому значению.
Преимущества этого метода по сравнению с другими методами, которые пропингуют сервер для проверки интернет-соединения:
Время выполнения Android зависит от модели телефона, поэтому вы не всегда сможете выполнять эти команды, как показано ниже: Почему ping работает на некоторых устройствах, а не на других?
Проверка связи с сервером не всегда работает из-за страниц входа / перенаправления в сетях Wi-Fi, которые могут создать ложное представление о соединении.
Этот ответ написан на Kotlin и использует библиотеку Fuel для загрузки файла из Интернета методом fetchUrlAsString
, но любая библиотека может быть заменена, если вы уверены, что ваш HTTP-запрос не кэшируется. Думайте о showConnectionWarning()
и hideConnectionWarning()
как эквивалентных internet connection status = false
и internet connection status = true
соответственно.
private val networkReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val activeNetworkInfo = (context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).activeNetworkInfo
if (activeNetworkInfo != null) {
if (activeNetworkInfo.isConnectedOrConnecting) {
//Launches a coroutine to fetch file asynchronously
launch {
try {
//Downloads file from url on the internet - use any library you want here.
val connectionStatus = fetchUrlAsString(<url_for_file_on_internet>)
//check if the contents of the file is as expected
if (connectionStatus == "Connected To Database") {
hideConnectionWarning()
} else {
showConnectionWarning()
}
} catch (e: Exception) {
//Catches an exception - fetchUrlAsString only throws an exception if there is no internet
showConnectionWarning()
}
}
} else {
showConnectionWarning()
}
} else {
showConnectionWarning()
}
}
}
private suspend fun fetchUrlAsString(url: String): String = suspendCoroutine { cont ->
url.httpGet().header(Pair("pragma", "no-cache"), Pair("cache-control", "no-cache")).responseString { _, _, result ->
when (result) {
is Result.Failure -> {
cont.resumeWithException(result.getException())
}
is Result.Success -> {
cont.resume(result.value)
}
}
}
}
Вам потребуются следующие разрешения:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />