我是一个我已经
的场景 subject1: PublishSubject
和subject2:BehaviorSubject
。
首先,我为subject1
发出单项,然后我为subject2
发出项目,但在此之后我还要向subject1
发出不同的项目。
fun emittingItems() {
subject1.onNext(functionA1)
subject2.onNext(functionB)
if (something) subject1.onNext(functionA2)
}
我会收到按此顺序排列的项目:functionA1
,functionA2
,functionB
。
为什么我会出现这种行为?如何按以下顺序发出项目:functionA1
,functionB
,functionA2
。
订阅主题:
val disposable = viewModel.subject1
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::someFunction())
disposables.add(disposable)
答案 0 :(得分:0)
使用observeOn(AndroidSchedulers.mainThread())
,您可以在主线程上安排事件的传播。调度本身是顺序的,而每个调度的Runnable
可能会处理添加到用于它的队列中的多个元素。
这是一种竞争条件,当主线程本身调用emittingItems()
并且从任何其他线程调用它时可能会出现这种情况。
但是既然您正在处理两个不同的异步流,那么您不能指望在两个不同的观察者中进行任何顺序观察。
您可以通过将两个源合并为一个流来实现给定的目标:
Observable.merge(subject1, subject2)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subject);