RxJava2 - 使用PublishSubject发出项目

时间:2018-05-31 14:32:59

标签: android rx-java2 subject

我是一个我已经

的场景

subject1: PublishSubjectsubject2:BehaviorSubject

首先,我为subject1发出单项,然后我为subject2发出项目,但在此之后我还要向subject1发出不同的项目。

fun emittingItems() {
    subject1.onNext(functionA1)
    subject2.onNext(functionB)
    if (something) subject1.onNext(functionA2)
}

我会收到按此顺序排列的项目:functionA1functionA2functionB

为什么我会出现这种行为?如何按以下顺序发出项目:functionA1functionBfunctionA2

订阅主题:

val disposable = viewModel.subject1
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::someFunction())
disposables.add(disposable)

1 个答案:

答案 0 :(得分:0)

使用observeOn(AndroidSchedulers.mainThread()),您可以在主线程上安排事件的传播。调度本身是顺序的,而每个调度的Runnable可能会处理添加到用于它的队列中的多个元素。

这是一种竞争条件,当主线程本身调用emittingItems()并且从任何其他线程调用它时可能会出现这种情况。

但是既然您正在处理两个不同的异步流,那么您不能指望在两个不同的观察者中进行任何顺序观察。

您可以通过将两个源合并为一个流来实现给定的目标:

Observable.merge(subject1, subject2)
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(subject);