将协程与使用回调处理程序的第三方库一起使用
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
}
}
}
以下是当前第三方 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
}
}
}