Kotlin中使用不同构造函数构建时如何复用重写方法?
Android Kotlin 兼容不同API版本的NetworkCallback构造方案
你可以通过抽离回调核心逻辑,再根据API版本包装对应构造的NetworkCallback来避免重复代码,只需要写一次重写方法的核心实现。
实现方案
先把onCapabilitiesChanged的业务逻辑抽成独立实现,再根据API版本选择对应的构造函数创建NetworkCallback实例,复用同一套逻辑:
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager // 抽离核心回调逻辑 val coreCallback = object : NetworkCallback() { override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities) val ssid = if (Build.VERSION.SDK_INT >= 29) { (networkCapabilities.transportInfo as WifiInfo).ssid } else { (applicationContext?.getSystemService(Context.WIFI_SERVICE) as WifiManager).connectionInfo.ssid } Log.d(TAG, "onCapabilitiesChanged network: $network ssid: $ssid") } } // 根据API版本选择对应构造的NetworkCallback并注册 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { cm.registerDefaultNetworkCallback(object : NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) { override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { coreCallback.onCapabilitiesChanged(network, networkCapabilities) } }) } else { cm.registerDefaultNetworkCallback(coreCallback) }
更简洁的封装写法
如果需要多次使用该回调,可以把逻辑封装成函数,进一步简化调用:
private fun buildNetworkCallback(): NetworkCallback { val coreLogic = { network: Network, capabilities: NetworkCapabilities -> val ssid = if (Build.VERSION.SDK_INT >= 29) { (capabilities.transportInfo as WifiInfo).ssid } else { (applicationContext?.getSystemService(Context.WIFI_SERVICE) as WifiManager).connectionInfo.ssid } Log.d(TAG, "onCapabilitiesChanged network: $network ssid: $ssid") } return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { object : NetworkCallback(FLAG_INCLUDE_LOCATION_INFO) { override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities) coreLogic(network, networkCapabilities) } } } else { object : NetworkCallback() { override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities) coreLogic(network, networkCapabilities) } } } } // 调用时 val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager cm.registerDefaultNetworkCallback(buildNetworkCallback())
这种方式既保证了不同API版本使用对应的构造函数,又只维护一套核心业务逻辑,避免了代码冗余。
内容的提问来源于stack exchange,提问作者theblitz
相关产品推荐
相关产品推荐

