间隔调度的RxJava可观察量比指定的时间多

时间:2016-01-05 10:40:00

标签: java multithreading reactive-programming rx-java

在下面的代码中,observable应该每300毫秒启动一次。我通过模拟需要1秒钟的背景活动来加强它。我期待由于我使用的是一个使用下面的线程池的调度程序,因此可观察区间将每隔300毫秒继续触发一个新线程。相反的是,间隔可观察每次等待一整秒,然后再次开火。这是理想的行为吗?如果任务需要的时间超过所要求的时间,那怎么能强迫它并行启动呢?

以下是代码:

Observable
            .interval(300, TimeUnit.MILLISECONDS, Schedulers.io())
                .doOnNext(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        System.out.println("action thread: " + Thread.currentThread());
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                })
                .map(new Func1<Long, Float>() {
                    @Override
                    public Float call(Long aLong) {
                        final double result = Math.random();
                        return new Float(result);
                    }
                })
                .takeWhile(new Func1<Float, Boolean>() {
                    @Override
                    public Boolean call(Float aFloat) {
                        return aFloat >= 0.01f;
                    }
                })
            .subscribe(new Action1<Float>() {
                @Override
                public void call(Float aFloat) {
                    System.out.println("observing thread: " + Thread.currentThread());
                    System.out.println(aFloat);
                }
            });

1 个答案:

答案 0 :(得分:2)

Observable本质上是顺序的,所以如果你进入睡眠,例如你,你就会阻止整个序列。要进行背景计算,您必须通过android:layout_height="wrap_content"observeOn将其移至另一个线程。在这种情况下,您可以在另一个执行休眠的observable中subscribeOn / flatMap并将结果合并回主序列:

concatMapEager