在下面的代码中,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);
}
});
答案 0 :(得分:2)
Observable本质上是顺序的,所以如果你进入睡眠,例如你,你就会阻止整个序列。要进行背景计算,您必须通过android:layout_height="wrap_content"
或observeOn
将其移至另一个线程。在这种情况下,您可以在另一个执行休眠的observable中subscribeOn
/ flatMap
并将结果合并回主序列:
concatMapEager