You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:20:59