试图了解渠道。我想对 android BluetoothLeScanner 进行通道化。为什么会这样:
fun startScan(filters: List<ScanFilter>, settings: ScanSettings = defaultSettings): ReceiveChannel<ScanResult?> {
val channel = Channel<ScanResult>()
scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
channel.offer(result)
}
}
scanner.startScan(filters, settings, scanCallback)
return channel
}
但不是这个:
fun startScan(scope: CoroutineScope, filters: List<ScanFilter>, settings: ScanSettings = defaultSettings): ReceiveChannel<ScanResult?> = scope.produce {
scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
offer(result)
}
}
scanner.startScan(filters, settings, scanCallback)
}
它会告诉我Channel was closed
何时想offer
第一次打电话。
EDIT1:根据文档:The channel is closed when the coroutine completes.
这是有道理的。我知道我们可以使用suspendCoroutine
withresume
进行一次性替换callback
。然而,这是一个监听器/流的情况。我不希望协程完成