RxJava延迟观察到了意外延迟

时间:2017-03-10 16:12:12

标签: android rx-java rx-android

我使用RxJava observables设置了一个事件序列。基本上,我合并了使用Observable.just(Events.*)创建的不同事件,并使用observable.delay(time, timeUnit, scheduler)函数设置了不同的延迟。然后我将它们发布到PublishSubject(下面代码中的events)并订阅PublishSubject以观察下面代码中的序列(observeEvents()函数)。它过去工作正常,但最近我在我的设备上看到一个非常奇怪的行为(OnePlus One与Android 5.0.2)(并没有在模拟器上看到它)。基本上事件变得混乱,具有较高延迟的事件可以在具有较小延迟的事件之前出现,具有较小延迟的事件可以在队列的末尾出现,有时所有事件可能以正确的顺序出现。前3个事件特别经常混合。有时根本没有观察到某些事件。这可能发生什么?

代码在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)
}

2 个答案:

答案 0 :(得分:0)

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

这篇中篇文章将向您解释差异https://medium.com/fueled-android/rxify-a-simple-spell-for-complex-rxjava-operators-part-2-b82b379f5c7f#.ekppat50o

答案 1 :(得分:0)

原来这个问题是由calculateScheduler引起的,当我将Schedulers.computation()更改为Schedulers.newThread()时,事件开始在预期的时间启动。

相关问题