Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin:如果网络断开连接,则使用ConnectionManager检查网络状态将返回null。怎么会?_Android_Kotlin_Connectivity - Fatal编程技术网

Android Kotlin:如果网络断开连接,则使用ConnectionManager检查网络状态将返回null。怎么会?

Android Kotlin:如果网络断开连接,则使用ConnectionManager检查网络状态将返回null。怎么会?,android,kotlin,connectivity,Android,Kotlin,Connectivity,我尝试使用以下功能检查网络的状态(已连接或已断开): // Check Network status private fun isNetworkAvailable(): Boolean { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) return if (connectivityManager is ConnectivityManager) { val netwo

我尝试使用以下功能检查网络的状态(已连接或已断开):

// Check Network status
private fun isNetworkAvailable(): Boolean {
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE)
    return if (connectivityManager is ConnectivityManager) {
        val networkInfo = connectivityManager.activeNetworkInfo
        networkInfo.isConnected
    }
    else false
}
这给了我一个机会 java.lang.IllegalStateException:networkInfo不能为空-错误 在断开网络的情况下运行时。为什么?我怎样才能解决这个问题

根据
activeNetworkInfo
可能为空:

返回有关当前活动的默认数据网络的详细信息。什么时候 已连接,此网络是传出连接的默认路由。 在启动网络之前,应始终检查isConnected() 交通。当没有默认网络时,这可能返回null

要确保它不会崩溃,请使用以下命令:

 private fun isNetworkAvailable(): Boolean {
        val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE)
        return if (connectivityManager is ConnectivityManager) {
            val networkInfo: NetworkInfo? = connectivityManager.activeNetworkInfo
            networkInfo?.isConnected ?: false
        } else false
    }

最简单的方法之一是,向上下文类添加一个扩展,如下所示

val Context.isConnected: Boolean
get() {
    return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
        .activeNetworkInfo?.isConnected == true
}
现在你可以在活动中使用它,比如

 if (!isConnected) {
 // connection is not available...
 }

您可以在活动、片段或上下文中的任何地方使用这种方式

使用此代码,肯定会有帮助



getActiveNetwork
在API 29中已被弃用,因此这是最好的解决方案:

fun isInternetAvailable(context: Context): Boolean {
    var result = false
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val networkCapabilities = connectivityManager.activeNetwork ?: return false
        val actNw =
            connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
        result = when {
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
            else -> false
        }
    } else {
        connectivityManager.activeNetworkInfo?.run {
            result = when (type) {
                ConnectivityManager.TYPE_WIFI -> true
                ConnectivityManager.TYPE_MOBILE -> true
                ConnectivityManager.TYPE_ETHERNET -> true
                else -> false
            }

        }
    }
    return result
}

我错误地认为.isConnected将始终返回布尔值。networkInfo已弃用。检查此项以获取更新响应:
fun isInternetAvailable(context: Context): Boolean {
    var result = false
    val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val networkCapabilities = connectivityManager.activeNetwork ?: return false
        val actNw =
            connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
        result = when {
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
            actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
            else -> false
        }
    } else {
        connectivityManager.activeNetworkInfo?.run {
            result = when (type) {
                ConnectivityManager.TYPE_WIFI -> true
                ConnectivityManager.TYPE_MOBILE -> true
                ConnectivityManager.TYPE_ETHERNET -> true
                else -> false
            }

        }
    }
    return result
}