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

在RXJava2中是否有等效的doAfterSubscribe?

许曦
2023-03-14
    PublishSubject<String> publishSubject = PublishSubject.create();
    Observable<String> fooObservable = publishSubject.filter(value -> value.startsWith("foo"))
            .doOnSubscribe(disposable -> {
                publishSubject.onNext("foobar");
            })
            .replay(1)
            .refCount();

    fooObservable.subscribe(val -> log.info("A val : <{}>", val));
A val : <foobar>

请注意,我使用以下代码得到了相同的结果:

PublishSubject<String> publishSubject = PublishSubject.create();
Observable<String> fooObservable = publishSubject.filter(value -> value.startsWith("foo"))
        .replay(1)
        .refCount();

publishSubject.onNext("foobar");
fooObservable.subscribe(val -> log.info("A val : <{}>", val));

所以问题是,fooObservable直到订阅了PublishSubject之后才订阅PublishSubject,

是否有一种方法可以在第一次订阅FooObservable之后立即运行代码?

PublishSubject<String> publishSubject = PublishSubject.create();
BehaviorSubject<String> fooObservable = BehaviorSubject.create();
publishSubject.filter(value -> value.startsWith("foo")).subscribe(fooObservable);
publishSubject.onNext("foobar");
fooObservable.subscribe(val -> log.info("A val : <{}>", val));
public Observable<Response> getObservable(Request req);

如果请求与已经订阅的请求匹配,那么observable应该在订阅时立即提供最新的匹配值。

当没有订阅者时,我需要取消我包装的服务的订阅。

共有1个答案

马朝斑
2023-03-14

我认为您需要publish()connect()。在这里你可以读到更多关于它的信息。

在你的情况下,它会是这样的:

PublishSubject<String> publishSubject = PublishSubject.create();
Observable<String> fooObservable = publishSubject
    .filter(value -> value.startsWith("foo"))
    .publish();

fooObservable.subscribe(val -> log.info("A val : <{}>", val));
Observable<Object> o2 = fooObservable.map { new Object() }
Observable<Object> o3 = fooObservable.map { /* Something here*/ }

Disposable disposable = fooObservable.connect()

但请记住执行disposable.dispose()以避免泄漏

BehaviorSubject<String> publishSubject = BehaviorSubject.create();
Observable<String> fooObservable = publishSubject.filter(value ->         
value.startsWith("foo"));
fooObservable.subscribe(val -> log.info("A val : <{}>", val));
publishSubject.onNext("foobar");
 类似资料:
  • 问题内容: 使用以下代码: 我得到以下html: 我怎样才能没有任何标签?是否有InnerText等效项? 问题答案: 所有你需要的是:

  • 问题内容: 尝试在Java / Swing中构建GUI应用程序。我主要习惯于使用VB之类的工具在Windows方面“绘画” GUI(或更准确地说,是Gupta SQLWindows …想知道有多少人知道那是什么;-)。 我在Swing中找不到等效的Group Box … 使用组框,您将在几个相关小部件周围有一个方形框(通常带有标题)。一个示例是围绕几个单选按钮的分组框(标题说明了单选按钮的含义,例

  • 问题内容: 我们需要查看对象在Javascript中具有哪些方法/字段。 问题答案: 正如其他人所说,您可以使用Firebug,这将使您在Firefox上无后顾之忧。Chrome和Safari都具有内置的开发人员控制台,该控制台具有与Firebug控制台几乎相同的界面,因此您的代码应可跨这些浏览器移植。对于其他浏览器,有Firebug Lite 。 如果您不适合使用Firebug,请尝试以下简单脚

  • 问题内容: 一些数据库支持以下命令: 本质上,我需要提取前10条记录,然后提取10条记录,然后提取10条记录,等等。也许有另一种方式可以做到这一点,但是在过去,对于支持“ START AT”的数据库,我已经像上面那样完成了。 问题答案: 哪个版本的SQL Server? 在SQL Server 2000中,这确实是一个痛苦(尽管可以使用诸如stingyjack发布的丑陋技巧)。 在2005年及之后

  • ChromeAPI提供了一个获取当前窗口(返回包含当前正在执行的代码的窗口)的方法。Safari有等效的方法吗?

  • 问题内容: 在预发布文档中,似乎没有Swift版本的CGPathApply。是否有同等的或替代的?我正在尝试获取CGPath的所有子路径,以便可以从其他起点重绘它。 问题答案: 斯威夫特3.0 在Swift 3.0中,您可以这样使用: 斯威夫特2.2 通过添加,您现在可以直接从Swift进行调用。这是做必要魔术的包装器: (请注意,我的代码中没有提到,但是在Core Graphics模块的声明中使