这是在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
出现时暂停,然后重置出现startTime
时STOP
。
scan
几乎可以正常工作,但我不知道如何在计时器达到0后停止并且每秒仍然会发送PLAY
,因为它会发送重复信息。它也不允许在状态和观察值之间进行分离。因此,scan
累积的值必须与Observable
内的值相同(如果有意义的话)。
我应该做些什么?
答案 0 :(得分:0)
如果我理解正确,那么您与scan
走在正确的轨道上。你只需要
.takeUntil(state -> state.hasCompleted)
在您需要停止时停止(可能是takeWhile
,这取决于)。.map(state -> state.getValute())
获取值这有意义吗?