簡體   English   中英

在RxJava中調用Observable的任何訂戶回調之前,請執行操作

[英]Do an action before any subscriber callback of an Observable is called in RxJava

我有一個Observable鏈(RxJava 1),我想在observable完成其工作時(在它發出某些東西之前 )但在調用任何用戶回調之前做一些一次性操作(我想更新一些AtomicBoolean值,並且讓所有訂閱者都看到新值)。

我最好的選擇是以線程安全的方式執行此操作?

我檢查了doOnTerminatedoOnCompleteddoAfterTerminate 但似乎無法保證順序 :我放置了一些日志,有時會在任何這些方法之前執行第一個訂閱者回調。

是否有某種方式可以明確地表示“我希望在任何回調之前執行此操作”,還是只需要在從我的實用程序方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM