使用RxJava创建计时器

时间:2018-09-15 07:44:23

标签: android rx-java2 countdowntimer

目前,我正在使用CountDownTimer,该数字从一个数字倒数,然后onFinish 执行一个操作并重置计时器,从另一个数字倒数。

例如这样的输入:

Remaining time = 13 | Interval = 30

结果如下:

13 12 .. 3 2 1 0 30 29 .. 3 2 1 0 30 29 ...

我尝试创建一个链,使用intervaldelay和其他operators生成所需的输出,但是我尚未找到解决方案。

2 个答案:

答案 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) }
}