【发布时间】:2019-07-30 19:49:34
【问题描述】:
我有一个发射项目的 RxObservable。我有一个 RxObserver 消耗该项目,打开某些东西,等待 30 秒,然后关闭同样的东西。如果在这 30 秒等待的中间,Observable 发出另一个项目,则 Observer 需要取消计时器并重新启动前一个进程。使用 CountDownTimer 实现该解决方案非常简单。这是我写的内容的sn-p:
.subscribe {
ledTimer?.cancel()
ledTimer = object : CountDownTimer(COUNTDOWN_MS, COUNTDOWN_INTERVAL_MS) {
override fun onTick(timeRemaining: Long) {
Log.d(
TAG,
"%d seconds remaining from recent Pcu Event.".format(timeRemaining / COUNTDOWN_INTERVAL_MS)
)
}
override fun onFinish() {
Log.d(TAG, "Timer has completed.")
ledSubject.onNext(LedEvent.LedOff)
}
}
ledSubject.onNext(it)
ledTimer?.start()
}
如您所见,如果计时器正在运行,我将取消它,创建一个新对象并启动它。我需要将其转换为使用 Rx。我坚持的部分是计时器的取消功能。这是我在没有“中断”功能的情况下提出的:
ledStream
.doOnNext{
ledSubject.onNext(it)
}.flatMap {
Observable.timer(COUNTDOWN_S, TimeUnit.SECONDS)
}.subscribe{
ledSubject.onNext(LedEvent.LedOff)
}
所以它非常简洁明了,但是当发出后续项目时,它不会重置。我看过像switchOnNext 这样的运算符,但对Rx 的掌握还不够好。如果我能看到一个带有解释的简单示例,那将是一个很大的帮助。
【问题讨论】:
标签: java kotlin rx-java2 countdowntimer reactivex