Timer RXjava:控制系统功能

时间:2015-06-05 22:27:40

标签: 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 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;秒。

非常感谢

1 个答案:

答案 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信号的流合并。