Создайте таймер с помощью RxJava - PullRequest
0 голосов
/ 15 сентября 2018

В настоящее время я использую CountDownTimer, чтобы отсчитывал от числа и onFinish запускал действие и сбрасывал таймер, начиная отсчет с другого числа.

Например, вводимые данные:

Remaining time = 13 | Interval = 30

Результат такой:

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

Я пытался создать цепочку, которая генерирует желаемый результат, используя interval, delay и другие operators, но я пока не нашел решения.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я бы создал диапазон, повторял его бесконечно и отбрасывал первые пару предметов, а затем задерживал каждую эмиссию:

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) }
}
0 голосов
/ 20 сентября 2018

Одно из возможных решений

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()
            })

Результат должен быть таким, как вы ожидали.

...