问题描述
我想使用Kotlin协程实现计时器,类似于使用RxJava实现的计时器:
I want to implement timer using Kotlin coroutines, something similar to this implemented with RxJava:
Flowable.interval(0, 5, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.map { LocalDateTime.now() }
.distinctUntilChanged { old, new ->
old.minute == new.minute
}
.subscribe {
setDateTime(it)
}
它将每隔一分钟发出LocalDateTime.
It will emit LocalDateTime every new minute.
推荐答案
我认为它仍处于试验阶段,但是您可以使用 TickerChannel 会每X毫秒产生一个值:
I believe it is still experimental, but you may use a TickerChannel to produce values every X millis:
val tickerChannel = ticker(delayMillis = 60_000, initialDelayMillis = 0)
repeat(10) {
tickerChannel.receive()
val currentTime = LocalDateTime.now()
println(currentTime)
}
如果您需要在订阅"为每个滴答"做某事时继续进行工作,则可以launch
从该频道读取并执行您想要做的事的背景协程:
If you need to carry on doing your work while your "subscribe" does something for each "tick", you may launch
a background coroutine that will read from this channel and do the thing you want:
val tickerChannel = ticker(delayMillis = 60_000, initialDelayMillis = 0)
launch {
for (event in tickerChannel) {
// the 'event' variable is of type Unit, so we don't really care about it
val currentTime = LocalDateTime.now()
println(currentTime)
}
}
delay(1000)
// when you're done with the ticker and don't want more events
tickerChannel.cancel()
如果您想从循环内部停止,可以简单地中断循环,然后取消频道:
If you want to stop from inside the loop, you can simply break out of it, and then cancel the channel:
val ticker = ticker(500, 0)
var count = 0
for (event in ticker) {
count++
if (count == 4) {
break
} else {
println(count)
}
}
ticker.cancel()
这篇关于如何使用Kotlin协程实现计时器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!