我有RXjava的问题。 我的系统有三个可观察的发送信号(温度传感器)给应用函数zip的监听器,然后计算接收值的平均值。
我必须实现一个功能,根据参数" t"经过几毫秒后平均温度超出范围,系统发出异常信号。
例如:
a = anomaly
x = average value
- = Second
if t = 3:
x-x-x-x-a-a-x => ok
x-x-x-a-a-a-x => ko
我的代码在这里:
public class Example extends Thread {
@override
public void run() {
/*Create 3 observable*/
Observable<Double> alfa = Observable.create((
Subscriber<? super Double> subscriber) -> {
new ObservableTempStream().start();
});
Observable<Double> bravo = Observable.create((
Subscriber<? super Double> subscriber) -> {
new ObservableTempStream().start();
});
Observable<Double> charlie = Observable.create((
Subscriber<? super Double> subscriber) -> {
new ObservableTempStream().start();
});
/*Create 1 observable that apply func avg with zip*/
ConnectableObservable<Double> averageTempStream = Observable.zip(
alfa, bravo, charlie,
(Double a, Double b, Double c) -> ((a + b + c) / 3)).publish();
averageTempStream.connect();
averageTempStream.subscribe((Double v) -> {
if ((v) < (averageTempSensors - threshold)
|| (v) > (averageTempSensors + threshold)) {
System.out.println("Value out of threshold: " + v);
} else {
System.out.println("Value avg it's ok: " + v);
}
}, (Throwable t) -> {
System.out.println("error " + t);
}, () -> {
System.out.println("Completed");
});
}
}
可以采用什么策略来解决这个问题?
是否有可以与异步流一起使用的函数?
在我的代码中:
每当平均值超出范围时,我都会报告错误的存在(实际上,其中一个传感器发出了峰值)。
相反,我只有在平均值超出范围超过&#34; t&#34;秒。
非常感谢
答案 0 :(得分:0)
这个怎么样:
averageTempStream.map((Double v) -> { // check whether the value is ok
(v > averageTempSensors - threshold) && (v < averageTempSensors + threshold)
})
.distinctUntilChanged() // ignore subsequent identical values
// (e. g. "x-x-x-x-a-a-x" becomes "x- - - -a- -x")
.debounce(t, TimeUnit.SECONDS) // only emit a value if it not followed by
// another one within t seconds
// (e. g. "x- - - -a- -x" becomes " - -x- - - - - -x",
// because the final x comes within t seconds of the a and thus prevents it from being passed down the chain)
.subscribe((Boolean ok) -> {
if (ok) {
System.out.println("Value avg is ok!");
} else {
System.out.println("Value out of threshold!");
}
}, (Throwable t) -> {
System.out.println("error " + t);
}, () -> {
System.out.println("Completed");
});
请注意,当然,debounce
发出的所有项目都会被延迟t秒(如果知道在该时间间隔内没有更新的项目,那还有什么呢?) - 所以好的 - 信号也被延迟了。你可以通过以下方法克服这个问题:(1)过滤上面的流来删除所有的ok信号;(2)将它与仅包含(未延迟的)ok信号的流合并。