Android断网启动时网络连接检测失效问题排查
问题原因
你的网络检测实现只监听网络状态变化事件(onAvailable/onLost回调),但没有在Flow创建时主动发送当前的初始网络状态。当应用启动时已经处于断网状态,没有触发任何状态变化回调,导致Flow没有发射任何值,collect代码块完全没有执行,因此只打印了ViewModel 1的日志,而ViewModel 2/ViewModel 3的日志不会出现。
解决方案
在NetworkConnectivity的callbackFlow中,注册网络回调后立即主动获取并发送当前的网络状态,确保Flow在启动时就有初始值发射。
修改后的网络连接类代码
class NetworkConnectivity @Inject constructor(private val manager: ConnectivityManager, private val request: NetworkRequest) : ConnectivityStatus { override fun observe(): Flow<Boolean> { return callbackFlow { val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) launch { send(true) } } override fun onLost(network: Network) { super.onLost(network) launch { send(false) } } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { manager.registerDefaultNetworkCallback(callback) } else { manager.registerNetworkCallback(request, callback) } // 主动发送初始网络状态,解决启动时无状态的问题 launch { send(isNetworkAvailable()) } awaitClose { manager.unregisterNetworkCallback(callback) } } } // 封装获取当前网络状态的逻辑,兼容不同Android版本 private fun isNetworkAvailable(): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val network = manager.activeNetwork val capabilities = manager.getNetworkCapabilities(network) capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) } else { @Suppress("DEPRECATION") val networkInfo = manager.activeNetworkInfo networkInfo != null && networkInfo.isConnected } } }
额外说明
修改后,无论应用启动时处于联网还是断网状态,networkConnectivity.observe().collect都会立即收到初始状态值,进入对应的代码分支,打印ViewModel 2或ViewModel 3的日志,同时仍然会监听后续的网络状态变化。
内容的提问来源于stack exchange,提问作者Dr.KeyOk
相关产品推荐
相关产品推荐

