我尝试使用此功能检查我的网络状态(已连接或已断开连接):
// 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不能为null - 错误 在使用断开的网络运行时。为什么?我该如何解决这个问题?
答案 0 :(得分:10)
根据docs 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
}
答案 1 :(得分:2)
使用此代码,肯定会有所帮助
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
}
}
答案 2 :(得分:2)
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 :(得分:0)
最简单的方法之一是向Context类添加一个扩展,如下所示,
val Context.isConnected: Boolean
get() {
return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
.activeNetworkInfo?.isConnected == true
}
现在您可以在类似活动中使用它,
if (!isConnected) {
// connection is not available...
}
您可以在活动,片段或上下文中的任何位置使用此方式。