将倒计时取消功能转换为RxJava
我有一个RxObservable,它发出一个项目。我有一个RxObserver,它使用这个项目,打开某些东西,等待30秒,然后关闭同样的东西。如果在30秒的中间等待可观察的发射另一个项目,观察者需要取消计时器并重新启动先前的过程。这个解决方案非常简单,可以通过倒计时来实现。下面是我写的一段话:将倒计时取消功能转换为RxJava,java,kotlin,rx-java2,countdowntimer,reactivex,Java,Kotlin,Rx Java2,Countdowntimer,Reactivex,我有一个RxObservable,它发出一个项目。我有一个RxObserver,它使用这个项目,打开某些东西,等待30秒,然后关闭同样的东西。如果在30秒的中间等待可观察的发射另一个项目,观察者需要取消计时器并重新启动先前的过程。这个解决方案非常简单,可以通过倒计时来实现。下面是我写的一段话: .subscribe { ledTimer?.cancel() ledTimer = object : CountDownTimer(COUNTDOWN_
.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。我被卡住的部分是定时器的取消功能。这是我在没有“中断”功能的情况下想到的:
因此,它非常漂亮和简洁,但当随后的项目发出时,它不会重置。我看过像这样的运营商,但还没有对Rx有足够的了解。如果我能看到一个简单的例子和解释,那将是一个很大的帮助。你可以使用
debounce
操作符。以下是一个例子:
ledStream
.doOnNext{
ledSubject.onNext(it)
}
.debounce(COUNTDOWN_S, TimeUnit.SECONDS)
.subscribe{
ledSubject.onNext(LedEvent.LedOff)
}
ledStream
.doOnNext{
ledSubject.onNext(it)
}
.debounce(COUNTDOWN_S, TimeUnit.SECONDS)
.subscribe{
ledSubject.onNext(LedEvent.LedOff)
}