Rx java 定时器RXjava:控制系统功能

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

我对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");
        });
}
公共类示例扩展了线程{
@凌驾
公开募捐{
/*创建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
aka
throttleWithTimeout
?如果在配置的时间内没有跟随ok信号,那么只会转发ko信号…非常感谢@david.mihola!这样,信号会像我一样被过滤。延迟目前不是问题:-)读者也可能对类似问题的回答感兴趣: