Android Kotlin中Activity与自定义类异步回调的基础术语是什么?
问题答案
你要找的核心机制是接口回调,针对你的Kotlin+Android+BLE异步场景,下面是最优实现方案:
方案1:Kotlin函数类型回调(优先推荐,代码最简洁)
Kotlin原生支持函数类型作为参数,不需要额外定义接口,逻辑和嵌入式开发中的函数指针高度相似,适配你的场景步骤如下:
- 第一步:在
CustomClass中定义可空的函数类型变量,用于接收回调实现
class CustomClass { // 定义回调规则:入参是你要回传的BLE数据(示例为字节数组,可替换为解析后的自定义实体类),无返回值 var onBleDataReceived: ((ByteArray) -> Unit)? = null // 你实际的BLE数据包接收逻辑写在这里,收到数据包时触发回调即可 private fun onBlePacketCollected(rawData: ByteArray) { onBleDataReceived?.invoke(rawData) } }
- 第二步:在Activity中实例化
CustomClass时,直接赋值回调逻辑
class YourActivity : AppCompatActivity() { private lateinit var customClass: CustomClass override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 实例化自定义类 customClass = CustomClass() // 实现回调逻辑 customClass.onBleDataReceived = { bleRawData -> // 注意:BLE异步回调默认运行在子线程,更新UI需要切换到主线程 runOnUiThread { // 这里写你收到数据后的处理逻辑,比如更新UI、存储数据等 Log.d("BLE_RECEIVE", "收到数据包:${bleRawData.contentToString()}") } } } }
方案2:传统接口回调(兼容Java混编场景)
如果你的项目存在Java和Kotlin混编需求,可以用传统的接口形式实现,逻辑更通用:
- 第一步:定义回调接口
interface BleDataCallback { fun onDataReceived(data: ByteArray) }
- 第二步:在
CustomClass中持有接口实例
class CustomClass { var callback: BleDataCallback? = null private fun onBlePacketCollected(rawData: ByteArray) { callback?.onDataReceived(rawData) } }
- 第三步:Activity实现接口并绑定
class YourActivity : AppCompatActivity(), BleDataCallback { private lateinit var customClass: CustomClass override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) customClass = CustomClass() customClass.callback = this } // 实现接口方法接收数据 override fun onDataReceived(data: ByteArray) { runOnUiThread { // 处理接收到的BLE数据 } } }
关键注意项
页面销毁时要清空回调引用,避免内存泄漏:
override fun onDestroy() { super.onDestroy() // 方案1清空逻辑 customClass.onBleDataReceived = null // 方案2清空逻辑 // customClass.callback = null }
如果你的项目已经引入Jetpack组件,也可以用LiveData实现数据观察,本质是观察者模式的回调变种,更适合数据需要被多个组件同时监听的场景。
内容的提问来源于stack exchange,提问作者Marcelo
相关产品推荐
相关产品推荐

