目前,我正在使用CountDownTimer
,该数字从一个数字倒数,然后onFinish
执行一个操作并重置计时器,从另一个数字倒数。
例如这样的输入:
Remaining time = 13 | Interval = 30
结果如下:
13 12 .. 3 2 1 0 30 29 .. 3 2 1 0 30 29 ...
我尝试创建一个链,使用interval
,delay
和其他operators
生成所需的输出,但是我尚未找到解决方案。
答案 0 :(得分:1)
可能的解决方案之一
fun countDown(startCounter: Long, nextCounter: Long): Observable<Long> {
return Observable.intervalRange(startCounter, startCounter+2, 0, 1, TimeUnit.SECONDS)
.map { 2*startCounter - it }
.flatMap { if(it >= 0) Observable.just(it) else countDown( nextCounter, nextCounter) }
}
然后像使用它
countDown(13, 30)
.subscribeOn(Schedulers.computation())
.subscribe({
System.out.println(it.toString())
}, {
it.printStackTrace()
})
结果应符合您的预期。
答案 1 :(得分:1)
我要创建一个范围,无限期重复,并放下前几项,然后延迟每次发射:
fun countdownTimer(remainingTime: Long, interval: Int): Flowable<Int> {
return Flowable.range(0, interval + 1)
.map { interval - it }
.repeat()
.skip(interval - remainingTime)
.concatMap { Flowable.just(it).delay(1, TimeUnit.SECONDS) }
}