Kotlin:如果网络断开,使用ConnectivityManager检查网络状态将返回null.怎么会?

CEO*_*pps 2 android connectivity kotlin

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

// 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
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个 java.lang.IllegalStateException:networkInfo不能为null - 在断开网络运行时出错.为什么?我该如何解决这个问题?

Lev*_*ira 14

根据文档 activeNetworkInfo可能为null:

返回有关当前活动的默认数据网络的详细信息 连接时,此网络是传出连接的默认路由.在启动网络流量之前,您应该始终检查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
    }
Run Code Online (Sandbox Code Playgroud)


Ali*_*iSh 6

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
}
Run Code Online (Sandbox Code Playgroud)