[英]Do an action before any subscriber callback of an Observable is called in RxJava
我有一個Observable
鏈(RxJava 1),我想在observable完成其工作時(在它發出某些東西之前 )但在調用任何用戶回調之前做一些一次性操作(我想更新一些AtomicBoolean
值,並且讓所有訂閱者都看到新值)。
我最好的選擇是以線程安全的方式執行此操作?
我檢查了doOnTerminate
, doOnCompleted
, doAfterTerminate
但似乎無法保證順序 :我放置了一些日志,有時會在任何這些方法之前執行第一個訂閱者回調。
是否有某種方式可以明確地表示“我希望在任何回調之前執行此操作”,還是只需要在從我的實用程序方法return
它之前,先將自己作為Observable
第一個訂閱者訂閱,然后在該訂閱者中更新AtomicBoolean
?
您可以在返回給訂閱者的觀察者鏈中使用doOnNext()
運算符。
AtomicBoolean firstCome = new AtomicBoolean( false );
...
Observable<SomeData> observerChain =
emitSomeData()
.doOnNext( ignored -> firstCome.set( true ) )
.share();
return observerChain;
編輯:使用share()
運算符允許多個訂閱者。
要回答我自己的問題:這段代碼有點復雜而不是我的,因此我在問問題時不太了解。
基本上,代碼如下所示; 可觀察對象發出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
無論如何,這段代碼很可能可以重寫,從而完全避免了可變狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.