这是在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)
}
}
}
其中 fullTime
和 controlCommands
是 Observable
,它们分别发出关于当前开始时间的事件以倒数并说明下一步做什么 . 我希望链接 controlCommands
并能够保持状态从 startTime
开始,当 PLAY
事件出现时将倒计时, PAUSE
出现时暂停,当 STOP
出现时重置为 startTime
.
scan
几乎可以工作,但我不知道如何在计时器命中0后停止,并且每秒仍然会发送 PLAY
,因为它将发送重复信息 . 此外,它不允许状态和观察值之间的分离 . 所以我用 scan
积累的值必须与 Observable
中的值相同(如果这是有道理的) .
任何想法我应该做什么?
1 回答
如果我理解正确的话,你就会走上正确的轨道
scan
. 您只需要a
.takeUntil(state -> state.hasCompleted)
在需要停止时停止(ow可能是takeWhile
,这取决于) .然后
.map(state -> state.getValute())
获取值这有意义吗?