rxjava2中的运算符延迟

时间:2019-02-21 08:48:35

标签: java android rx-java rx-java2

我是rxjava2的新手。当我读到有关它的书时,发现其中一些我对操作员延迟不了解的东西。

  

我们可以使用delay()运算符推迟发射。它将容纳任何收到的排放   并将每个延迟指定的时间段。如果我们想将排放延迟三倍   秒,我们可以这样做:

Outer diameter of eye = 20
Thickness of fork = 7.5
Thickness of single eye = 17.5
Diameter of pin = 10
Diameter of knuckle pin and collar = 15 

前面的代码段的输出如下:  贝塔  Α  伽玛  三角洲  厄普西隆

我认为输出只是“ Alpha”,因为他们说

  

由于delay()在不同的调度程序上运行(例如Observable.interval()),我们   需要利用sleep()方法使应用程序保持足够长的生命周期才能看到此消息   发生。每次发射都会延迟三秒钟

延迟3s,我认为有一个发射为“ Alpha”,但它的所有发射都可以观察到。

3 个答案:

答案 0 :(得分:0)

根据Documentation,在给定时间内延迟操作符“延迟”发射。

因此,它将显示“ 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 I:收到:Alpha
  • 2019-02-21 18:02:33.464我:收到:Beta
  • 2019-02-21 18:02:33.466 I:收到:伽玛
  • 2019-02-21 18:02:33.467我:收到:达美
  • 2019-02-21 18:02:33.469 I:收到:Epsilon

答案 1 :(得分:0)

这是您想要的吗?

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

答案 2 :(得分:0)

在您的情况下,延迟操作只会延迟所有流3秒,并且所有元素都会立即在rx文档http://reactivex.io/documentation/operators/delay.html

中发出

如果您想将每个元素延迟3​​秒,可以这样做:

       Observable.fromArray("Alpha", "Beta", "Gamma", "Delta",
            "Epsilon")
            .concatMap(s -> Observable.just(s).delay(3, TimeUnit.SECONDS))
            .subscribe(s -> System.out.println("Received: " + s));