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 秒超时过去因为最后一个值现在太陈旧了?

您可以使用 takeWhiletakeUntil 运算符来完成您的可观察率。

等待 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)
                  }