将协程与使用回调处理程序的第三方库一起使用

Using Coroutines with Third party library that's using callback handlers

以下是当前第三方 SDK 实施工作原理的细分。

class Handler(val context: Context) {


    val device = Controller.getInstance(context,Listener())

    fun connectBT(BTDevice:BluetoothDevice){
        device.connectBT(BTDevice)
    }


}

然后是监听器实现

class Listener: BBDeviceController.BBDeviceControllerListener{
    override fun onBTConnected(device: BluetoothDevice?) {
        println("Device Connected")
        // Send back to function that device is connect
    }
}

这是一个简单的例子,但想法是,当你按下一个按钮时,它会调用 connectBT() 然后包含这样的结果:

val handler = Handler(this)
val res = handler.connectBT(btDevice)

我知道您可以在函数 handler.connectBT() 上使用 suspendCoroutine,但问题是如何将 SDK 的侦听器结果 return 返回到调用的主函数是吗?

使用suspendCoroutine时,您需要在延续对象上调用resume/resumeWithException/etc。你可以 store/pass 这个对象在任何地方,例如你的 listener:

class Handler(val context: Context) {
    val listener = Listener()
    val device = Controller.getInstance(context, listener)

    suspend fun connectBT(BTDevice:BluetoothDevice){
        suspendCoroutine<Unit> { continuation ->
            listener.continuation = continuation
            device.connectBT(BTDevice)
        }
    }
}

class Listener: BBDeviceController.BBDeviceControllerListener{
    var continuation: Continuation<Unit>? = null
    
    override fun onBTConnected(device: BluetoothDevice?) {
        println("Device Connected")
        if (continuation != null) {
            continuation?.resume(Unit)
            continuation = null
        }
    }
}