Android Kotlin网络连通性检测:初始化时断网状态不触发提示
问题根因
你使用的ConnectivityManager.NetworkCallback的回调逻辑为:
- 注册时如果当前存在符合要求的网络,会主动触发
onAvailable回调,这就是你在联网状态下打开Activity能正常收到提示的原因 - 初始状态为断网时,既没有可用网络触发
onAvailable,也没有网络从可用变为丢失的过程触发onLost,没有任何回调执行,LiveData就不会发送事件,自然不会弹出断网提示
修复方案
在CheckConnectivity类的onActive方法中,注册完回调后主动查询一次当前网络状态,给LiveData设置初始值即可,修改后的完整代码如下:
class CheckConnectivity(private val connectivityManager: ConnectivityManager) : LiveData<Boolean>() { constructor(application: Application) : this( application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager ) private val networkCallback = @RequiresApi(Build.VERSION_CODES.LOLLIPOP) object: ConnectivityManager.NetworkCallback(){ override fun onAvailable(network: Network) { super.onAvailable(network) postValue(true) } override fun onLost(network: Network) { super.onLost(network) postValue(false) } } @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun onActive() { super.onActive() val builder=NetworkRequest.Builder() connectivityManager.registerNetworkCallback(builder.build(),networkCallback) // 新增:主动获取当前网络状态设置初始值 val isConnected = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val networkCapabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork) networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true } else { @Suppress("DEPRECATION") connectivityManager.activeNetworkInfo?.isConnected == true } postValue(isConnected) } @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun onInactive() { super.onInactive() connectivityManager.unregisterNetworkCallback(networkCallback) } }
注意事项
请确保你已经在AndroidManifest.xml中添加了网络状态访问权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
内容的提问来源于stack exchange,提问作者Codist
相关产品推荐
相关产品推荐

