Kotlin:使用ConnectivityManager检查网络状态,如果网络断开连接,则返回null。为什么?

4

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

// 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 must not be null - error错误。为什么会出现这个错误?如何解决?

4个回答

17

根据文档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
    }

1
我错误地假设 .isConnected 总是返回一个布尔值。 - CEO tech4lifeapps
1
networkInfo已经被弃用。请查看以下更新响应:https://dev59.com/JVQJ5IYBdhLWcg3wlm_B - MarMass

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
}

3

使用这段代码,它一定会有所帮助


fun checkConnectivity(context: Context): Boolean {

        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
    
        if(activeNetwork?.isConnected!=null){
            return activeNetwork.isConnected
        }
        else{
            return false
        }
    }

1

最简单的方法之一是,像下面这样向Context类添加扩展:

val Context.isConnected: Boolean
get() {
    return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
        .activeNetworkInfo?.isConnected == true
}

现在你可以在活动中使用它,例如:
 if (!isConnected) {
 // connection is not available...
 }

您可以在活动、片段或上下文中的任何地方使用此方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接