我试图模拟合并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)
答案 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
隐藏所有这些都是交错的,因为它会在所有奇数值之后打印所有偶数值。
任何解决方案都取决于你想要实现的目标 - 这只是一个游乐场的例子,还是它模拟了一些真正的问题?