当前位置: 首页 > 知识库问答 >
问题:

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

单嘉泽
2023-03-14

我有一个< code>Observable链(RxJava 1),我想在Observable完成它的工作时(就在它发出某个东西之前),但在调用任何订户回调之前(我想更新某个< code>AtomicBoolean值,并让所有订户都看到新值),执行一些一次性操作。

以线程安全的方式执行此操作的最佳选择是什么?

我检查了 doOnOnTerioneddoOnCompeddoTerTerminate,但似乎没有关于顺序的保证:我放了一些日志,有时在任何这些方法之前执行第一个订阅者回调。

有没有什么方法可以明确地说“我希望它在任何回调之前执行”,或者我是否必须在从我的实用方法< code >返回它之前,将自己订阅为< code>Observable的第一个订阅者,并在该订阅者中更新< code>AtomicBoolean?

共有2个答案

莘羽
2023-03-14

回答我自己的问题:这段代码有点复杂,不是我的,所以我在问这个问题时没有很好地理解它。

基本上代码如下所示;可观察的发出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);

主要解决方法是将已完成回调添加到订阅中,并在那里使用布尔值:

    Subscription mySub = getData()
            .observeOn(AndroidSchedulers.mainThread(), true)
            .subscribe(onNextDoSomethingWithABoolean,
              onErrorDoSomethingWithABoolean,
              onCompletedDoSomethingWithTheBoolean);

除此之外,我还:

  • 布尔值更改为原子布尔值
  • 已更改 do“终止”“完成”

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

袁玮
2023-03-14

您可以在返回给订阅者的观察者链中使用< code>doOnNext()操作符

AtomicBoolean firstCome = new AtomicBoolean( false );
...
Observable<SomeData> observerChain =
  emitSomeData()
    .doOnNext( ignored -> firstCome.set( true ) )
    .share();
return observerChain;

编辑:使用<code>share()

 类似资料:
  • 我是RxJava的新手。我有一个,用于下载图像URL列表并将其转换为位图的简单网络操作。 在活动的上,我取消订阅可观察到的以避免内存泄漏。 我能看到的是,如果我在图像下载过程中退出活动,后台任务也会被终止。我只想继续做背景工作,即使我已经取消了《观察家》的订阅。有可能吗?

  • 例: 注意:是非Android 运行环境, 使用的是RxJava2.x

  • 问题内容: 在我的服务器应用程序中,我正在从Java应用程序连接到受Kerberos保护的Hadoop群集。我正在使用HDFS文件系统,Oozie,Hive等各种组件。在应用程序启动时,我确实打电话给 这将返回我的实例,并在应用程序生存期内保留它。当执行特权操作时,我使用启动它们。 这可以正常工作,但我想知道是否以及何时更新kerberos票?我发现了一种似乎在快要到期时都会进行票证更新的方法。我

  • 我只是把我的脚趾头浸入RxJava中,所以请温柔点:)到今天为止,我对异步任务还可以,但它变得越来越复杂,我想我终于偶然发现了一个需求,实际上我很难用简单的异步任务来满足这个需求。这是我的用例: 1)我有一个方法(我们称之为),它需要在会话中运行一次。如果以前运行过,它会返回缓存的响应。否则,它会执行一个网络调用,然后根据结果执行另一个。这两个网络任务都使用OkHttp运行,并且是同步的。方法本身

  • 问题内容: 以下是我用来设置状态的代码。 即使成功创建了数据库,也无法调用,因为它始终是未定义的。 我试过了: 但是它仍然失败,尝试使用和使用,仍然没有运气。 我该如何解决? 问题答案: 您需要将正确的(类上下文)与回调方法绑定在一起,然后只有您才能访问类的属性和方法。 可能的解决方案: 1- 使用 箭头功能 ,如下所示: 2- 或与一起使用,如下所示: 您使用的方式也将起作用,保存方法内部的引用

  • 问题内容: 问题 我正在使用内联函数定义设置反应 然后在DOM引用中未设置 我的理解是,回调应该在安装期间运行,但是在ref回调函数 之前* 调用添加语句揭示。 * 例如,我看过的其他代码示例在github上的讨论都表明相同的假设,应该在中定义的任何回调 之后调用,甚至在对话中也要说明 那么在所有的ref回调都执行完之后,componentDidMount是否被触发? 是。 我正在使用反应 15.