有没有办法在等待MuableStateFlow的下一个值时挂起?

    val state = MutableStateFlow<Int>(1)

    launch(Dispatchers.Default) {
        var counter = 1
        while (true) {
            state.emit(counter++)
            delay(1000)
        }
    }

    launch(Dispatchers.Default) {
        while (state.value < 1000) {
            print(state.value)
            delay(250)
        }
    }

目前这是打印111122223333444...,但我希望它打印1234...

用例:我正在构建一个驱动程序;我有一个协程程序,它不断地读取从更新连接状态的套接字接收的数据.

如果我想发送数据,我需要首先判断状态是否为空闲,如果不是,则等到状态为空闲后再写入数据.

做这件事的一种非常粗暴的方式就是

while (state.value != 100) { delay(100) }

但这将表现不佳.

我要做的是,当我从状态检索值时,它应该获得最后一个值,而不挂起;如果值是正确的值,则中断循环,否则挂起,直到值更改,并且只有在值正确的情况下,才中断While循环,否则继续挂起,直到值再次更改.

可以使用互斥体,在写入新值时解锁互斥体,在再次读取互斥体时锁定互斥体,而While循环将挂起,直到值再次更改,但可以说使用一些现成的东西会很好.

        var counter = 1
        val mutex = Mutex(locked = true)

        launch(Dispatchers.Default) {
            while (true) {
                counter++
                mutex.unlock()
                delay(100)
            }
        }

        launch(Dispatchers.Default) {
            while (true) {
                if (counter > 100) {
                    break
                }
                println(counter)
                mutex.lock()
            }
        }

推荐答案

您根本没有使用流方法--只需转换和收集流,而不是发明奇怪的循环.

state
    .takeWhile { it < 1000 }
    .collect { print(it) }

或者,如果您不需要打印可以在一行中暂停的每个值:

state.first { it >= 1000 }

Kotlin相关问答推荐

这些Kotlin函数等效吗?

最好的方法来创建一个 map 在kotlin从两个列表

在Kotlin中处理结果的高阶函数

为什么在Spring中,对事务性方法调用的非事务方法调用仍然在事务中运行?

Scala与Kotlin中的迭代

在Kotlin中的嵌套when语句中,else块是强制性的吗?

Flow.state In() 未从其来源接收新值

使用 StateFlow 时如何移除监听器?

kotlin 父类具有依赖于抽象变量的变量

为什么记得不将 StateFlow 转换为特定类型?

将 SharedPreferences 中的值公开为流

使用空键映射获取

错误:cannot find symbol import com.gourav.news.databinding.ActivityDetailBindingImpl;

判断 AAR 元数据值时发现的一个或多个问题:

是否可以在 kotlin 中嵌套数据类?

如何从 Firestore 查询中排除元素?

kotlin-bom 库是做什么的?

Lint 错误:可疑的相等判断:在 Object DiffUtilEquals 中未实现 equals()

将字符串转换为HashMap的最简单方法

如何在不绑定ViewModel(MVVM)中的UI的情况下使用android导航?