如何在发射后产生延迟?



我希望我的Observable的每个发射都有一个延迟发生在它发射之后。例如,对于从Observable.fromIterable(listOf(1,2,3))发出的每个项目,我希望事后有一个可变/动态延迟。

。给定一个计时器或延迟[3, 5, 10]列表,我希望下面的时间线与我的可观察对象一起发生:

1 -> Wait 3 seconds -> 2 -> Wait 5 seconds -> 3 -> Wait 10 seconds

请注意,这与

不同:Wait 3 seconds -> 1 -> Wait 5 seconds -> 2 -> Wait 10 seconds -> 3

可以通过.zip + .delay或Observable轻松实现。计时器

使用zip()是正确的方法。当您想要之后的延迟时发出第一个值,然后您可以使用startWith()为第一个组合添加零延迟。代码可能看起来像这样:

Observable<Integer> values = Observable.fromArray(1,2,3,4,5);
Observable<Long> delays = Observable.fromArray(300L, 400L, 500L, 600L);

Observable<Integer> delayedValues = values.zipWith(
delays.startWith(0L),
new BiFunction<Integer, Long, Integer>() {
@Override
public Integer apply(Integer v, Long d) throws Exception {
Thread.sleep(d);
return v;
}
}
);
System.out.println("Begin subscribing");
long startTime = System.currentTimeMillis();
delayedValues.subscribe(v -> {
long currentTime = System.currentTimeMillis();
long diff = currentTime - startTime;
System.out.println("["+diff+"] "+v);
});
System.out.println("After subscribing");

这将生成以下输出:

Begin subscribing
[35] 1
[336] 2
[736] 3
[1236] 4
[1836] 5
After subscribing

如您所见,第一个值被立即打印,紧接着是下一个值的300ms延迟,直到您到达末尾。

相关内容

  • 没有找到相关文章

最新更新