问题描述
我是新的rxjava2.when,当我读到有关它的书时,有一些我不了解操作员延迟的信息。
我们可以使用delay()运算符推迟发射。 它将保留所有收到的排放,并将每个排放延迟指定的时间段。 如果我们想将发射延迟三秒钟,我们可以这样做:
public static void main(String[] args) {
Observable.just("Alpha", "Beta", "Gamma" ,"Delta",
"Epsilon")
.delay(3000, TimeUnit.SECONDS)
.subscribe(s -> System.out.println("Received: " + s));
sleep(3000);
}
public static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
前面的代码段的输出如下:Beta Alpha Gamma Delta Epsilon
我认为输出只是“ Alpha”,因为他们说
因为delay()在不同的调度程序(例如Observable.interval())上运行,所以我们需要利用sleep()方法使应用程序保持足够长的生命周期才能看到这种情况。 每次发射将延迟三秒钟
延迟3s,我认为有一个发射为“ Alpha”,但它的所有发射都是可观察到的。
1楼
根据 ,延迟操作员在给定时间内“延迟”发射。
因此,它将显示“ Alpha”,“ Beta”,“ Gamma”,“ Delta”,“ Epsilon”,而不仅仅是“ Alpha”。
println("started")
val subscribe = Observable.just("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
.delay(3, TimeUnit.SECONDS)
.subscribe { s -> println("Received: $s") }
此代码将产生3秒后发出的所有五个字符串。
- 2019-02-21 18:02:30.285我:开始
- 2019-02-21 18:02:33.459我:收到:阿尔法
- 2019-02-21 18:02:33.464我:收到:Beta
- 2019-02-21 18:02:33.466我:收到:伽玛
- 2019-02-21 18:02:33.467 I:收到:达美航空
- 2019-02-21 18:02:33.469 I:收到:Epsilon
2楼
这是您想要的吗?
val source1 = Observable.just("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
val source2 = Observable.interval(3000, TimeUnit.MILLISECONDS)
val observable = Observable.zip(source1, source2, object : BiFunction<String, Long, Any> {
override fun apply(t1: String, t2: Long): Any {
Log.d("Sometag", "Received $t1")
return "Something"
}
}).subscribe()
输出量
2019-02-21 13:40:15.502 D/Sometag: Received Alpha
2019-02-21 13:40:18.502 D/Sometag: Received Beta
2019-02-21 13:40:21.502 D/Sometag: Received Gamma
2019-02-21 13:40:24.502 D/Sometag: Received Delta
2019-02-21 13:40:27.502 D/Sometag: Received Epsilon
3楼
在您的情况下,延迟操作将仅延迟所有流3秒,并且所有元素将立即发出,更多信息请参见rx文档
如果您想将每个元素延迟3??秒,您可以这样做:
Observable.fromArray("Alpha", "Beta", "Gamma", "Delta",
"Epsilon")
.concatMap(s -> Observable.just(s).delay(3, TimeUnit.SECONDS))
.subscribe(s -> System.out.println("Received: " + s));