RXJava - 在确定的时间段内连续发出值
RXJava - continuously emit values for determined period
我有一个心率传感器,它会定期发出一个值(介于 500-3000 毫之间)。心率传感器何时发出信号是不确定的。使用 RXJava,我希望有一个常量发出 'last seen' 心率值,并且该常量最多发出 10 秒的值,直到将其标记为太陈旧并改为发送 NULL。 NULL 表示心率传感器不再发出传感器读数。
我有以下 (kotlin) 代码:
val heartRateObservable: Observable<BLEDataValue> = observable
.flatMap { it.setupNotification(characteristic.uniqueIdentifier) }
.flatMap { it }
.map { BTDataPacket(characteristic.uniqueIdentifier, BleParseable(it)).btValue() }.onErrorReturn { BLEDataValueHeartRate(null) }
return Observable.combineLatest(Observable.interval(1000, TimeUnit.MILLISECONDS), heartRateObservable, BiFunction { _, t2 -> t2 })
问题:是否可以引入一种方法来重播最后一次看到的心率值,直到最后一个值变得陈旧(即在 10 秒内没有看到任何心率读数之后)..当心脏看到心率值它会重播直到新的心率值到达或者 10 秒超时过去因为最后一个值现在太陈旧了?
您可以使用 takeWhile
或 takeUntil
运算符来完成您的可观察率。
等待 10 次发射:
Observable heartbeat = Observable.interval(1000, TimeUnit.MILLISECONDS)
.takeWhile(e -> e < 10)
或使用timer
witj takeUntil
Observable heartbeat = Observable.interval(1000, TimeUnit.MILLISECONDS)
.takeUntil(Observable.timer(10000, TimeUnit.MILLISECONDS))
之后你说:
... and emit this for up to 10,000 Milliseconds from the last received sensor value after ...
为此你可以使用 switchMap
(如果我理解你的问题)
heartRateObservable
.switchMap(data -> heartbeat.map(data))
因此,心跳在每个最后发射数据后开始发射值。
val heartRateObservable: Observable<BLEDataValue> = observable
.flatMap { it.setupNotification(characteristic.uniqueIdentifier) }
.flatMap { it }
.map { BTDataPacket(characteristic.uniqueIdentifier, BleParseable(it)).btValue() }.onErrorReturn { BLEDataValueHeartRate(null) }
return heartRateObservable
.switchMap { data -> Observable.interval(1000, TimeUnit.MILLISECONDS)
.takeWhile(e -> e < 10)
.map(l -> data)
}
我有一个心率传感器,它会定期发出一个值(介于 500-3000 毫之间)。心率传感器何时发出信号是不确定的。使用 RXJava,我希望有一个常量发出 'last seen' 心率值,并且该常量最多发出 10 秒的值,直到将其标记为太陈旧并改为发送 NULL。 NULL 表示心率传感器不再发出传感器读数。
我有以下 (kotlin) 代码:
val heartRateObservable: Observable<BLEDataValue> = observable
.flatMap { it.setupNotification(characteristic.uniqueIdentifier) }
.flatMap { it }
.map { BTDataPacket(characteristic.uniqueIdentifier, BleParseable(it)).btValue() }.onErrorReturn { BLEDataValueHeartRate(null) }
return Observable.combineLatest(Observable.interval(1000, TimeUnit.MILLISECONDS), heartRateObservable, BiFunction { _, t2 -> t2 })
问题:是否可以引入一种方法来重播最后一次看到的心率值,直到最后一个值变得陈旧(即在 10 秒内没有看到任何心率读数之后)..当心脏看到心率值它会重播直到新的心率值到达或者 10 秒超时过去因为最后一个值现在太陈旧了?
您可以使用 takeWhile
或 takeUntil
运算符来完成您的可观察率。
等待 10 次发射:
Observable heartbeat = Observable.interval(1000, TimeUnit.MILLISECONDS)
.takeWhile(e -> e < 10)
或使用timer
witj takeUntil
Observable heartbeat = Observable.interval(1000, TimeUnit.MILLISECONDS)
.takeUntil(Observable.timer(10000, TimeUnit.MILLISECONDS))
之后你说:
... and emit this for up to 10,000 Milliseconds from the last received sensor value after ...
为此你可以使用 switchMap
(如果我理解你的问题)
heartRateObservable
.switchMap(data -> heartbeat.map(data))
因此,心跳在每个最后发射数据后开始发射值。
val heartRateObservable: Observable<BLEDataValue> = observable
.flatMap { it.setupNotification(characteristic.uniqueIdentifier) }
.flatMap { it }
.map { BTDataPacket(characteristic.uniqueIdentifier, BleParseable(it)).btValue() }.onErrorReturn { BLEDataValueHeartRate(null) }
return heartRateObservable
.switchMap { data -> Observable.interval(1000, TimeUnit.MILLISECONDS)
.takeWhile(e -> e < 10)
.map(l -> data)
}