如何修复connectionManager.activeNetworkInfo不能为null?使用kotlin

时间:2018-10-24 13:40:43

标签: android kotlin connection

我正在尝试检查连接性并在每种状态下执行一些操作,但是当我打开手机的连接时,应用崩溃了,它给了我这个错误“ cnxManager .activeNetworkInfo不能为空”

我的代码

private fun isConnected(webView: WebView){
    val cnxManager : ConnectivityManager = baseContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val netInfo : NetworkInfo = cnxManager.activeNetworkInfo

    if (netInfo.isConnected && netInfo.isConnectedOrConnecting){
        cnx_failed.visibility=View.INVISIBLE
        webView.visibility=View.VISIBLE
    }else{
        webView.visibility=View.INVISIBLE
        cnx_failed.visibility=View.VISIBLE
    }
}

1 个答案:

答案 0 :(得分:1)

这是由于Kotlin中所谓的“平台类型”所致。由于getActiveNetworkInfo()未被注释为@Nullable@NonNull,因此您可以选择将其声明为任一类型。因此,两者:

val netInfo: NetworkInfo = cnxManager.activeNetworkInfo

val netInfo: NetworkInfo? = cnxManager.activeNetworkInfo

是有效的声明。但是,正如Markus提到的那样,该方法可以返回null,因此您应将其声明为后者(可空类型)。在与Java平台类型进行互操作时,必须确保正确声明它。

考虑到这一点,您可以将代码重写为:

private fun updateConnectionStatus(webView: WebView) {
    val cnxManager = baseContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    // Declare as a nullable type
    val netInfo : NetworkInfo? = cnxManager.activeNetworkInfo

    // Safe check -- assigns to false if netInfo is null
    val connected = netInfo?.isConnectedOrConnecting ?: false
    cnx_failed.visibility = if (connected) View.INVISIBLE else View.VISIBLE
    webView.visibility = if (connected) View.VISIBLE else View.INVISIBLE
}