用RxJava重复对状态的操作

这是在Kotlin,但我认为任何编写Java的人都能理解。

我正在尝试用Rx制作一个秒表,而且我在实际停止和启动时遇到了一些麻烦。 最大的问题是,我不知道如何保持现在的时间,而修改它作为不同的行动(开始和停止)进来。这是我现在所拥有的。

fullTime.switchMap { startTime -> controlCommands.switchMap { command -> when (command) { ControlState.PLAY -> Observable.interval(1L, TimeUnit.SECONDS).map { ControlState.PLAY } ControlState.PAUSE -> Observable.just(ControlState.PAUSE) else -> Observable.just(ControlState.STOP) } } } 

fullTimecontrolCommandsObservable ,它们分别发出有关当前开始时间的事件,从中倒数,然后说下一步该做什么。 我想链接controlCommands并能够保持状态在startTime开始,当PLAY事件出现时将倒计时, PAUSE出现时PAUSE ,并在出现STOP时在startTime复位。

scan几乎工作,但我不知道如何停止计时器命中0和PLAY仍然每秒钟发送,因为它会发送重复的信息。 也不允许状态和观察值之间的分离。 所以我scan积累的值必须是Observable内部的值(如果有意义的话)。

任何想法我应该做什么?

如果我正确地理解你,你正在scan正确的轨道。 您只需

  • 一个.takeUntil(state -> state.hasCompleted)停止当你需要停止(也许一个takeWhile ,这取决于)。
  • 然后一个.map(state -> state.getValute())来获取该值

这有道理吗?