在RxJava中调用Observable的任何订阅者回调之前执行操作

时间:2018-03-08 17:41:46

标签: java rx-java rx-android

我有一个Observable链(RxJava 1),我希望在observable完成其工作(就在它发出一些东西之前)时执行一些一次性操作,但是 在任何订阅者之前回调被称为 (我想更新一些AtomicBoolean值,让所有订阅者都看到新值。)

以线程安全的方式做这件事最好的选择是什么?

我检查了doOnTerminatedoOnCompleteddoAfterTerminate 但似乎无法保证订单:我放了一些日志,有时是第一个订阅者回调在任何这些方法之前执行。

是否有某种方式可以明确说明"我希望在任何回调之前执行此操作",或者我只需在Observable之前订阅自己作为return的第一个订阅者从我的实用工具方法中获取它,并更新该订户中的AtomicBoolean

2 个答案:

答案 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

无论如何,这段代码可能会被重写以避免可变状态。