为什么在将2个observable合并到其他Observable时会有不需要的Log输出,而Observable每10秒缓冲一次

时间:2017-11-18 17:05:30

标签: kotlin rx-java rx-java2

我试图模拟合并2个不同的Observable流,每秒发送一些对象。该对象在这两个流中具有相同的Parent。

我想,在控制台中会在1秒后出现有价值的新对象。 但是,当我打印这些对象时,我会得到跳过先前发射的对象。所以喜欢具有值1,3,5,7等的对象

然而,在缓冲区中,它们合并了这两个,似乎它只缓冲了2,4,6,8等排放。

这是我的代码:

 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var counter = 0
    var counter2 = 0


    val periodicSomeClass1 = Observable.interval(1, TimeUnit.SECONDS)
            .flatMap(
                    {
                        counter++
                        Observable.just(SomeClass1("$counter", counter))
                    }
            )

    val periodicSomeClass2 = Observable.interval(1, TimeUnit.SECONDS)
            .flatMap(
                    {
                        counter2++
                        Observable.just(SomeClass2(counter2.toDouble()))
                    }
            )

    periodicSomeClass1.subscribe { t: SomeClass1 -> Log.v("periodicSomeClass1", t.toString())  }
    periodicSomeClass2.subscribe { t: SomeClass2 -> Log.v("periodicSomeClass2", t.toString())  }


    Observable.merge(periodicSomeClass1, periodicSomeClass2)
            .buffer(10, TimeUnit.SECONDS)
            .doOnSubscribe { Log.v("bufferObservable", "STARTED") }
            .subscribe { t: MutableList<Parent> ->
                Log.v("bufferObservable", "onNext")
                t.forEach { Log.v("onNext", it.toString()) }
            }
}

以下是我在Log输出中的第一个缓冲区/合并emsission:

 V/periodicSomeClass1: SomeClass1(a=1, b=1)
 V/periodicSomeClass2: SomeClass2(a=1.0)
 V/periodicSomeClass1: SomeClass1(a=3, b=3)
 V/periodicSomeClass2: SomeClass2(a=3.0)
 V/periodicSomeClass1: SomeClass1(a=5, b=5)
 V/periodicSomeClass2: SomeClass2(a=5.0)
 V/periodicSomeClass1: SomeClass1(a=7, b=7)
 V/periodicSomeClass2: SomeClass2(a=7.0)
 V/periodicSomeClass1: SomeClass1(a=9, b=9)
 V/periodicSomeClass2: SomeClass2(a=9.0)
 V/periodicSomeClass1: SomeClass1(a=11, b=11)
 V/periodicSomeClass2: SomeClass2(a=11.0)
 V/periodicSomeClass1: SomeClass1(a=13, b=13)
 V/periodicSomeClass2: SomeClass2(a=13.0)
 V/periodicSomeClass1: SomeClass1(a=15, b=15)
 V/periodicSomeClass2: SomeClass2(a=15.0)
 V/periodicSomeClass1: SomeClass1(a=17, b=17)
 V/periodicSomeClass2: SomeClass2(a=17.0)
 V/periodicSomeClass1: SomeClass1(a=19, b=19)
 V/periodicSomeClass2: SomeClass2(a=19.0)
 V/bufferObservable: onNext
 V/onNext: SomeClass1(a=2, b=2)
 V/onNext: SomeClass2(a=2.0)
 V/onNext: SomeClass1(a=4, b=4)
 V/onNext: SomeClass2(a=4.0)
 V/onNext: SomeClass1(a=6, b=6)
 V/onNext: SomeClass2(a=6.0)
 V/onNext: SomeClass1(a=8, b=8)
 V/onNext: SomeClass2(a=8.0)
 V/onNext: SomeClass1(a=10, b=10)
 V/onNext: SomeClass2(a=10.0)
 V/onNext: SomeClass1(a=12, b=12)
 V/onNext: SomeClass2(a=12.0)
 V/onNext: SomeClass1(a=14, b=14)
 V/onNext: SomeClass2(a=14.0)
 V/onNext: SomeClass1(a=16, b=16)
 V/onNext: SomeClass2(a=16.0)
 V/onNext: SomeClass1(a=18, b=18)

1 个答案:

答案 0 :(得分:1)

正如你在the comment on your other question中正确怀疑的那样,这个问题确实是相关的。

1。)您正在为两个源可观察对象订阅两次,一次直接订阅它们,一次订阅merge d Observable。

2。)所以你总共运行了四个Observable,其中两个正在递增(和读取)counter,另外两个正在递增(和读取)counter2。< / p>

3.。)对于这些对中的每一对,两个区间都会稍微偏移,每对中的第一个flatMap看到值n,将其递增到n+1并且打印出来。然后不久,另一个实例出现并看到n+1,增量为{​​{1}},打印等等。

最后,n+2隐藏所有这些都是交错的,因为它会在所有奇数值之后打印所有偶数值。

任何解决方案都取决于你想要实现的目标 - 这只是一个游乐场的例子,还是它模拟了一些真正的问题?