我有一个Observable
链(RxJava 1),我希望在observable完成其工作(就在它发出一些东西之前)时执行一些一次性操作,但是 在任何订阅者之前回调被称为 (我想更新一些AtomicBoolean
值,让所有订阅者都看到新值。)
以线程安全的方式做这件事最好的选择是什么?
我检查了doOnTerminate
,doOnCompleted
,doAfterTerminate
但似乎无法保证订单:我放了一些日志,有时是第一个订阅者回调在任何这些方法之前执行。
是否有某种方式可以明确说明"我希望在任何回调之前执行此操作",或者我只需在Observable
之前订阅自己作为return
的第一个订阅者从我的实用工具方法中获取它,并更新该订户中的AtomicBoolean
?
答案 0 :(得分:1)
您可以使用返回订阅者的观察者链中的doOnNext()
运算符。
AtomicBoolean firstCome = new AtomicBoolean( false );
...
Observable<SomeData> observerChain =
emitSomeData()
.doOnNext( ignored -> firstCome.set( true ) )
.share();
return observerChain;
编辑:使用share()
运算符允许多个订阅者。
答案 1 :(得分:0)
回答我自己的问题:这段代码有点复杂,而不是我的,所以在提问时我并不理解。
基本上代码如下; observable发出1或2个值。
该代码依赖于订阅者的onNext
回调。大多数时候(令人惊讶的是)它运行正常,即onNext
会看到原始作者想要的布尔值,但有时onAfterTerminate
只会在所有onNext
之后执行回调。
private Observable<...> getData() {
return dataStore.getData()
.doOnNext(...)
.map(...)
.doOnSubscribe(() -> myBoolean = true)
.doAfterTerminate(() -> myBoolean = false)
.map(...)
}
Subscription mySub = getData()
.observeOn(AndroidSchedulers.mainThread(), true)
.subscribe(onNextDoSomethingWithABoolean,
onErrorDoSomethingWithABoolean);
主要的解决方法是向订阅添加onCompleted
回调并使用布尔值:
Subscription mySub = getData()
.observeOn(AndroidSchedulers.mainThread(), true)
.subscribe(onNextDoSomethingWithABoolean,
onErrorDoSomethingWithABoolean,
onCompletedDoSomethingWithTheBoolean);
除此之外我还:
boolean
更改为AtomicBoolean
doAfterTerminate
更改为doOnTerminate
无论如何,这段代码可能会被重写以避免可变状态。