【发布时间】:2019-11-27 00:43:11
【问题描述】:
更新协程 1.3.0-RC
工作版本:
@FlowPreview
suspend fun streamTest(): Flow<String> = channelFlow {
listener.onSomeResult { result ->
if (!isClosedForSend) {
offer(result)
}
}
awaitClose {
listener.unsubscribe()
}
}
还可以查看 Roman Elizarov 的这篇 Medium 文章:Callbacks and Kotlin Flows
原始问题
我有一个发送多个字符串的流:
@FlowPreview
suspend fun streamTest(): Flow<String> = flowViaChannel { channel ->
listener.onSomeResult { result ->
if (!channel.isClosedForSend) {
channel.sendBlocking(result)
}
}
}
一段时间后,我想取消订阅该流。目前我做以下事情:
viewModelScope.launch {
beaconService.streamTest().collect {
Timber.i("stream value $it")
if(it == "someString")
// Here the coroutine gets canceled, but streamTest is still executed
this.cancel()
}
}
如果协程被取消,流仍然会被执行。只是没有订阅者在听新的价值观。如何取消订阅和停止stream 功能?
【问题讨论】:
-
我觉得这个问题和stackoverflow.com/questions/59680533/…是一样的
-
感谢您的评论。这不完全一样。我的问题是我的流发射器如何检测流是否不再需要并且它可以取消订阅侦听器。
-
有一些扩展函数可以让你从你的启动 {} 块中取消范围。如果您使用 Kotlin 1.3.7+,您现在应该可以安全地调用
cancel(),因为您在示例代码中拥有它。在这里查看答案:stackoverflow.com/a/65121663/1738090