Rx java 定时器RXjava:控制系统功能
我对RXjava有一个问题。 我的系统有三个可观察到的信号(温度传感器)发送到一个侦听器,该侦听器应用函数zip,然后计算接收到的值的平均值 我必须实现一个功能,根据参数“t”,在平均温度超出范围的毫秒数之后,系统发出异常信号 例如:Rx java 定时器RXjava:控制系统功能,rx-java,Rx Java,我对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 ex
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");
});
}
公共类示例扩展了线程{
@凌驾
公开募捐{
/*创建3个可观察的*/
可观察的alfa=可观察的.create((
订阅者这个呢:
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");
});
averageTempStream.map((双v)->{//检查该值是否正常
(v>averageTempSensors-阈值)和(v{
如果(确定){
System.out.println(“平均值正常!”);
}否则{
System.out.println(“值超出阈值!”);
}
},(可丢弃的t)->{
系统输出打印项次(“错误”+t);
}, () -> {
系统输出打印项次(“完成”);
});
请注意,当然,debounce
发出的所有项目都会延迟t秒(否则它怎么知道在该间隔内没有新的项目?)-因此ok信号也会延迟。您可以通过(1)过滤上述流以删除所有ok信号和(2)来克服这一问题将其与仅包含(未显示)的流合并ok信号。你有没有看一下debounce
akathrottleWithTimeout
?如果在配置的时间内没有跟随ok信号,那么只会转发ko信号…非常感谢@david.mihola!这样,信号会像我一样被过滤。延迟目前不是问题:-)读者也可能对类似问题的回答感兴趣: