【问题标题】:Convert CountDownTimer Cancel feature to RxJava将 CountDownTimer 取消功能转换为 RxJava
【发布时间】: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


    【解决方案1】:

    您可以只使用debounce 运算符。示例如下:

    ledStream
            .doOnNext{
                ledSubject.onNext(it)
            }
            .debounce(COUNTDOWN_S, TimeUnit.SECONDS)
            .subscribe{
                ledSubject.onNext(LedEvent.LedOff)
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多