将倒计时取消功能转换为RxJava

将倒计时取消功能转换为RxJava,java,kotlin,rx-java2,countdowntimer,reactivex,Java,Kotlin,Rx Java2,Countdowntimer,Reactivex,我有一个RxObservable,它发出一个项目。我有一个RxObserver,它使用这个项目,打开某些东西,等待30秒,然后关闭同样的东西。如果在30秒的中间等待可观察的发射另一个项目,观察者需要取消计时器并重新启动先前的过程。这个解决方案非常简单,可以通过倒计时来实现。下面是我写的一段话: .subscribe { ledTimer?.cancel() ledTimer = object : CountDownTimer(COUNTDOWN_

我有一个RxObservable,它发出一个项目。我有一个RxObserver,它使用这个项目,打开某些东西,等待30秒,然后关闭同样的东西。如果在30秒的中间等待可观察的发射另一个项目,观察者需要取消计时器并重新启动先前的过程。这个解决方案非常简单,可以通过倒计时来实现。下面是我写的一段话:

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