相关疑难解决方法(0)

Kotlin Flow:如何取消订阅/停止

更新协程 1.3.0-RC

工作版本:

@FlowPreview
suspend fun streamTest(): Flow<String> = channelFlow {
    listener.onSomeResult { result ->
        if (!isClosedForSend) {
            offer(result)
        }
    }

    awaitClose {
        listener.unsubscribe()
    }
}
Run Code Online (Sandbox Code Playgroud)

另请查看 Roman Elizarov 的这篇 Medium 文章:回调和 Kotlin 流程

原始问题

我有一个流发出多个字符串:

@FlowPreview
suspend fun streamTest(): Flow<String> = flowViaChannel { channel ->
    listener.onSomeResult { result ->
            if (!channel.isClosedForSend) {
                channel.sendBlocking(result)
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

一段时间后,我想取消订阅流。目前我执行以下操作:

viewModelScope.launch {
    beaconService.streamTest().collect {
        Timber.i("stream value $it")
        if(it == "someString")
            // Here the coroutine gets canceled, but streamTest is still executed …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-coroutines

20
推荐指数
6
解决办法
1万
查看次数

如何结束/关闭 MutableSharedFlow?

SharedFlow刚刚在协程 1.4.0-M1 中引入,它旨在替换所有BroadcastChannel实现(如设计问题描述中所述)。

我有一个用例,我使用 aBroadcastChannel来表示传入的 Web 套接字帧,以便多个侦听器可以“订阅”这些帧。当我移动到 a 时,我遇到的问题SharedFlow是当我收到关闭帧或上游错误时我无法“结束”流程(我想这样做是为了通知所有订阅者流程已经结束)。

当我想有效地“关闭” 时,如何使所有订阅终止SharedFlow?有没有办法区分正常关闭和异常关闭?(如频道)

如果MutableSharedFlow不允许将流的结尾传达给订阅者,如果BroadcastChannel被弃用/删除,有什么替代方法?

kotlin kotlin-coroutines kotlin-coroutines-flow

12
推荐指数
1
解决办法
2221
查看次数