使用RxJava在状态上重复操作
这是在Kotlin中,但我认为任何编写Java的人都能够理解 我想用Rx做一个秒表,但我在实际的停止和启动方面有点困难。最大的问题是,我不知道如何保持当前时间,同时随着不同操作(启动和停止)的到来而修改它。这是我现在得到的使用RxJava在状态上重复操作,java,rx-java,kotlin,rx-kotlin,Java,Rx Java,Kotlin,Rx Kotlin,这是在Kotlin中,但我认为任何编写Java的人都能够理解 我想用Rx做一个秒表,但我在实际的停止和启动方面有点困难。最大的问题是,我不知道如何保持当前时间,同时随着不同操作(启动和停止)的到来而修改它。这是我现在得到的 fullTime.switchMap { startTime -> controlCommands.switchMap { command -> when (command) { ControlState.PLAY
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
是可观察的命令,它们分别发出关于当前开始时间的事件进行倒计时,并说明下一步要做什么。我想将controlCommands
链接起来,并能够保持从startTime
开始的状态,当出现PLAY
事件时,该状态将倒计时;当出现pause
时暂停;当出现STOP
时,该状态将在startTime
重置
scan
几乎可以正常工作,但我不知道如何在计时器达到0后停止,并且仍然每秒发送一次PLAY
,因为它会发送重复的信息。此外,它不允许在状态和观察值之间进行分离。因此,我用scan
累积的值必须与可观察值中的值类型相同(如果有意义的话)
你知道我该怎么做吗?如果我理解正确,你的扫描就正确了。你只需要
- a
.takeUntil(state->state.hasscompleted)
在需要停止时停止(现在可能是atakeWhile
,视情况而定)
- 然后使用
.map(state->state.getValute())
获取值
这有意义吗?如果我理解正确,您的扫描就正确了。你只需要
- a
.takeUntil(state->state.hasscompleted)
在需要停止时停止(现在可能是atakeWhile
,视情况而定)
- 然后使用
.map(state->state.getValute())
获取值
这有意义吗?这会导致订阅完成,还是会在新命令/时间到来时继续?。takeUntil
会导致订阅终止-当条件满足时,它会从父级取消订阅。所以这不是我真正想要的,因为我想继续观察全职
和控制命令
.Hmmm-好的,你能制作一个大理石图来显示你的用例吗?我想我不理解你的要求。我希望全职
和控制命令
总是发出东西,因为它们来自用户界面。实际上,我要问的是,如何利用下游的知识暂停间隔
(扫描
)。当扫描结果为零时,我想停止在间隔上滴答作响,只使用零。我现在的尝试是只使用distinctunitrichanged
,我认为这对本例有效。这会导致订阅完成吗,或者,如果新命令/时间到来,它会继续吗?。takeUntil
将导致订阅终止-当条件满足时,它将从父级取消订阅。因此,这并不是我真正想要的,因为我想继续观察全职
和控制命令,你能制作一个大理石图来展示你的用例吗?我想我不理解你的要求。我希望全职
和控制命令
总是发出东西,因为它们来自用户界面。实际上,我要问的是,如何利用下游的知识暂停间隔
(扫描
)。当扫描结果为零时,我想停止在间隔上滴答作响,只使用零。我现在的尝试是只使用distinctunitrichanged
,我认为这对本例有效。