Пауза в потоке в Kotlin
Строитель flow - приостанавливаемая
корутина. Между отправками можно вызвать
delay: поток отдаст следующее значение
не раньше, чем истечет пауза, не блокируя при
этом поток насмерть.
Две метки с задержкой между ними показывают, что время течет внутри одного сбора:
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val ticks = flow {
emit("first")
delay(100)
emit("second")
}
ticks.collect { line ->
println(line)
}
}
}
"second" следует за "first" с
зазором не меньше заданных миллисекунд. Сборщик
ждет вместе со строителем, пока delay
не отпустит корутину.
Паузу можно ставить перед каждой отправкой в цикле, задавая ритм выдаче:
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val pulse = flow {
repeat(3) { step ->
delay(50)
emit(step)
}
}
pulse.collect { n ->
println(n)
}
}
}
В консоли появляются 0, 1 и
2 с промежутками между строками.
Функция delay внутри flow относится к
текущему проходу сбора, а не ко всей программе.
Поток печатает через emit строки
"wait" и "done", между ними
200 миллисекунд delay.
Соберите поток в runBlocking.
Три раза отправьте символ "*" из цикла,
перед каждой отправкой делая паузу 30
миллисекунд. Выведите символы при сборе.