将 CountDownTimer 取消功能转换为 RxJava
Convert CountDownTimer Cancel feature to RxJava
我有一个发射项目的 RxObservable。我有一个 RxObserver,它使用该项目,打开某些东西,等待 30 秒,然后关闭同样的东西。如果在等待 30 秒的中间 Observable 发出另一个项目,Observer 需要取消计时器并重新启动之前的进程。该解决方案使用 CountDownTimer 实施起来非常简单。这是我写的片段:
.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。我坚持的部分是计时器的取消功能。这是我在没有 "interrupt" 功能的情况下想出的:
ledStream
.doOnNext{
ledSubject.onNext(it)
}.flatMap {
Observable.timer(COUNTDOWN_S, TimeUnit.SECONDS)
}.subscribe{
ledSubject.onNext(LedEvent.LedOff)
}
所以它非常简洁明了,但是当发出后续项目时它不会重置。我看过像 switchOnNext 这样的运算符,但对 Rx 还没有足够的了解。如果我能看到一个简单的例子和解释,那将是一个很大的帮助。
您可以只使用 debounce
运算符。这是示例:
ledStream
.doOnNext{
ledSubject.onNext(it)
}
.debounce(COUNTDOWN_S, TimeUnit.SECONDS)
.subscribe{
ledSubject.onNext(LedEvent.LedOff)
}
我有一个发射项目的 RxObservable。我有一个 RxObserver,它使用该项目,打开某些东西,等待 30 秒,然后关闭同样的东西。如果在等待 30 秒的中间 Observable 发出另一个项目,Observer 需要取消计时器并重新启动之前的进程。该解决方案使用 CountDownTimer 实施起来非常简单。这是我写的片段:
.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。我坚持的部分是计时器的取消功能。这是我在没有 "interrupt" 功能的情况下想出的:
ledStream
.doOnNext{
ledSubject.onNext(it)
}.flatMap {
Observable.timer(COUNTDOWN_S, TimeUnit.SECONDS)
}.subscribe{
ledSubject.onNext(LedEvent.LedOff)
}
所以它非常简洁明了,但是当发出后续项目时它不会重置。我看过像 switchOnNext 这样的运算符,但对 Rx 还没有足够的了解。如果我能看到一个简单的例子和解释,那将是一个很大的帮助。
您可以只使用 debounce
运算符。这是示例:
ledStream
.doOnNext{
ledSubject.onNext(it)
}
.debounce(COUNTDOWN_S, TimeUnit.SECONDS)
.subscribe{
ledSubject.onNext(LedEvent.LedOff)
}