有没有办法在等待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()
}
}