使用RxJava在订阅上键入不匹配

时间:2015-04-20 10:22:18

标签: java reactive-programming rx-java

我有以下代码来获得平均滑动窗口。我在订阅函数中遇到类型不匹配错误。我试图使用RxMath平均函数获得cpu使用的平均值。

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import rx.*;
import rx.Observable;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.observables.MathObservable;

public class stack {
    private ScheduledThreadPoolExecutor executorPool;

    public void test() {
        Double tests = (double) 100;

        Observable myObservable = Observable.interval(1000, TimeUnit.MILLISECONDS)
                .map(new Func1<Long, Double>() {
                    @Override
                    public Double call(Long aLong) {
                        Double d = (double) 100;//calculate CPU usage                             
                        return d;
                    }
                })
                .window(1, TimeUnit.SECONDS)
                .flatMap(new Func1<Observable<Double>, Observable<Double>>() {
                    @Override
                    public Observable<Double> call(Observable<Double> windowObservable) {
                        return MathObservable.averageDouble(windowObservable);
                    }
                })
                .subscribe(new Action1<Double>() {
                    public void call(Double s) {
                        System.out.println(s);
                    }
                });
    }
}

2 个答案:

答案 0 :(得分:2)

只需从头开始删除Observable myObservable =

subscribe正在返回Subscription,而不是Observable。在您的情况下,您不需要记住对Observable的引用。

如果您这样做,请遵循以下模式:

Observable<Double> myObservable = stuffThatReturnsAnObservable();
Subscription subscription = myObservable.subscribe();

答案 1 :(得分:0)

要添加Rob在您的案例中提到的内容,您甚至不需要对订阅的引用,因为您所做的只是在订阅时向其传递操作。引用订阅后,您可以取消订阅,这将停止向您发送活动。