使用ConnectivityManager检测网络状态时断网返回null致异常原因
为什么网络断开时调用
isNetworkAvailable()会抛出java.lang.IllegalStateException: networkInfo must not be null? 嘿,这个问题我之前排查过,其实原因很直接:当设备完全没有网络连接的时候,connectivityManager.activeNetworkInfo会返回null,而你直接调用了networkInfo.isConnected——相当于对着一个不存在的对象调用方法,Kotlin的非空检查自然就会抛出这个异常啦。
具体原因拆解:
- Android系统的设计就是这样:当没有活跃的网络连接(不管是WiFi还是移动数据)时,
activeNetworkInfo不会返回一个“断开状态”的对象,而是直接返回null,表示根本没有对应的网络信息。 - 你的代码里没有提前判断
networkInfo是否为null,就直接访问它的isConnected属性,Kotlin默认要求变量非空,所以一旦实际值是null,就会触发这个IllegalStateException。
修复方案来啦!
方案1:快速修复旧代码(兼容低版本)
只需要在访问isConnected之前先判断networkInfo不为null就行:
private fun isNetworkAvailable(): Boolean { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) return if (connectivityManager is ConnectivityManager) { val networkInfo = connectivityManager.activeNetworkInfo // 先判空,再检查连接状态 networkInfo != null && networkInfo.isConnected } else false }
方案2:推荐使用官方新API(适配Android 6.0+,尤其Android 10+)
因为activeNetworkInfo在Android 10(API 29)已经被废弃了,官方更推荐用NetworkCapabilities来判断,还能更精准地检测网络是否真的能访问互联网(比如避免连接到需要登录的公共WiFi却无法上网的情况):
private fun isNetworkAvailable(): Boolean { val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager // 如果连ConnectivityManager都拿不到,直接返回无网络 connectivityManager ?: return false return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val activeNetwork = connectivityManager.activeNetwork ?: return false val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) ?: return false // 检查网络是否具备访问互联网的能力,且已经验证可用 networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } else { // 兼容Android 6.0以下的旧逻辑 val networkInfo = connectivityManager.activeNetworkInfo networkInfo != null && networkInfo.isConnected } }
内容的提问来源于stack exchange,提问作者CEO tech4lifeapps
相关产品推荐
相关产品推荐

