Как реализовать таймер с соплинами Kotlin - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу реализовать таймер, используя сопрограммы Kotlin, что-то похожее на это, реализованное в RxJava:

       Flowable.interval(0, 5, TimeUnit.SECONDS)
                    .observeOn(AndroidSchedulers.mainThread())
                    .map { LocalDateTime.now() }
                    .distinctUntilChanged { old, new ->
                        old.minute == new.minute
                    }
                    .subscribe {
                        setDateTime(it)
                    }

Он будет генерировать LocalDateTime каждую новую минуту.

1 Ответ

0 голосов
/ 22 февраля 2019

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

val tickerChannel = ticker(delayMillis = 60_000, initialDelayMillis = 0)

repeat(10) {
    tickerChannel.receive()
    val currentTime = LocalDateTime.now()
    println(currentTime)
}

Если вам нужно продолжать выполнять свою работу, пока ваша "подписка "что-то делает для каждого" тика ", вы можете launch фоновую сопрограмму, которая будет читать с этого канала и делать то, что вы хотите:

val tickerChannel = ticker(delayMillis = 60_000, initialDelayMillis = 0)

launch {
    for (event in tickerChannel) { // event is of type Unit, so we don't really care about it
        val currentTime = LocalDateTime.now()
        println(currentTime)
    }
}

// when you're done with the ticker and don't want more events
tickerChannel.cancel()
...