Android RxJava延迟可观测物引发意外延迟

Android RxJava延迟可观测物引发意外延迟,android,rx-java,rx-android,Android,Rx Java,Rx Android,我有一个使用RxJava可观测值设置的事件序列。基本上,我使用Observable.just(events.*.和Observable.delay(time,timeUnit,scheduler)函数设置的不同延迟来合并创建的不同事件。然后我将它们发布到PublishSubject(events在下面的代码中)并订阅该PublishSubject以观察序列(observeEvents()函数在下面的代码中)。它过去工作得很好,但最近我在我的设备上看到了一个非常奇怪的行为(OnePlus和andr

我有一个使用RxJava可观测值设置的事件序列。基本上,我使用
Observable.just(events.*.
Observable.delay(time,timeUnit,scheduler)
函数设置的不同延迟来合并创建的不同事件。然后我将它们发布到
PublishSubject
events
在下面的代码中)并订阅该
PublishSubject
以观察序列(
observeEvents()
函数在下面的代码中)。它过去工作得很好,但最近我在我的设备上看到了一个非常奇怪的行为(OnePlus和android 5.0.2的一个)(在emulator上看不到)。基本上,事件是混合的,具有较高延迟的事件可以出现在具有较小延迟的事件之前,具有较小延迟的事件可以出现在队列的末尾,有时所有事件可能以正确的顺序出现。前三个事件是混合的,尤其是经常。有时一些事件根本没有被观察到。这里会发生什么

代码在Kotlin中:

var computationScheduler = Schedulers.computation()

private val events: PublishSubject<Events> = PublishSubject.create()
private val userActionSubject: PublishSubject<Events> = PublishSubject.create()

Observable.merge(
            event0(),
            event1(),
            event2(),
            userActionOrEvent3(),
            userActionOrEvent4())
            .subscribe({
                // Weird timings are observed here already
                events.onNext(it)
            }, { e ->
                events.onError(e)
            }))

private fun userActionOrEvent4(): Observable<Events> {
    return Observable.amb(Observable.just(Events.Event4)
            .delay(12800, TimeUnit.MILLISECONDS, computationScheduler), userActionSubject.asObservable().subscribeOn(computationScheduler))
            .take(1)
}

private fun userActionOrEvent3(): Observable<Events> {
    return Observable.amb(Observable.just(Events.Event3)
            .delay(2800, TimeUnit.MILLISECONDS, computationScheduler), userActionSubject.asObservable().subscribeOn(computationScheduler))
            .take(1)
}

private fun event2() = Observable.just(Events.Event2)
        .delay(1800, TimeUnit.MILLISECONDS, computationScheduler)

private fun event1() = Observable.just(Events.Event1)
        .delay(200, TimeUnit.MILLISECONDS, computationScheduler)

private fun event0() = Observable.just(Events.Event0)
        .subscribeOn(computationScheduler)

open fun observeEvents(): Observable<Events> = events.asObservable().observeOn(AndroidSchedulers.mainThread())

open fun onUserAction() {
    userActionSubject.onNext(Events.Action)
}
var computationScheduler=Schedulers.computation()
私有val事件:PublishSubject=PublishSubject.create()
private val userActionSubject:PublishSubject=PublishSubject.create()
可观察的合并(
event0(),
event1(),
event2(),
userActionOrEvent3(),
userActionOrEvent4())
.订阅({
//这里已经观察到了奇怪的时间安排
events.onNext(it)
},{e->
事件。onError(e)
}))
private fun userActionOrEvent4():可观察{
返回Observable.amb(Observable.just(Events.Event4)
.delay(12800,TimeUnit.ms,计算调度器),userActionSubject.asObservable().subscribeOn(计算调度器))
.采取(1)
}
private fun userActionOrEvent3():可观察{
返回Observable.amb(Observable.just(Events.Event3)
.delay(2800,TimeUnit.ms,计算调度器),userActionSubject.asObservable().subscribeOn(计算调度器))
.采取(1)
}
private fun event2()=可观察的.just(Events.event2)
.延迟(1800,TimeUnit.ms,计算调度器)
private fun event1()=可观察的.just(Events.event1)
.延迟(200,TimeUnit.ms,计算调度器)
private fun event0()=可观察的.just(Events.event0)
.subscribeOn(计算调度程序)
打开有趣的observeEvents():Observable=events.asObservable().observeOn(AndroidSchedulers.mainThread())
开放式娱乐活动(){
userActionSubject.onNext(Events.Action)
}

这是因为您使用的是
merge()
而不是
concat


这篇中等篇幅的文章将向您解释两者的区别,这是因为您使用的是
merge()
而不是
concat


这篇中间文章将向您解释不同之处

原来问题是由computationScheduler引起的,当时我将
Schedulers.computation()
更改为
Schedulers.newThread()
事件在预期的时间触发。

原来问题是由computationScheduler引起的,当我将
Schedulers.computation()
更改为
Schedulers.newThread()
时,事件开始在预期的时间触发