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

RxJava。订阅开始时的初始下一步?

汲利
2023-03-14

我正在尝试实现一个使用可观察的发出更改的类。当对此可观察对象完成订阅时,我想发送一个启动/初始化事件。然后我想发送通常的事件。

例如假设我有两个不同的订户A和B。A和B在不同的时间开始订阅。如果是MyClass。getChanges()发出事件1、2、3、4和5。

如果A在事件1、2之间启动it订阅,则应接收以下事件:InitialEvent、2、3、4、5。

如果B在事件4和5之间启动it订阅,则B应接收以下事件:InitialEvent,5。

如何使用RxJava做到这一点?

谢谢

编辑1

我想我需要解释一下,“InitialEvent”每次发出时都是不同的。每次新订阅者开始从getChanged()订阅时,它都由MyClass计算。

我的场景是MyClass包含一个列表。“initialEvent”包含订阅完成时的列表。然后,对该列表的每个更改都从getChanges()发出。

共有3个答案

牧梓
2023-03-14

可能不是很优雅的方式仅仅使用一面旗帜怎么样?看起来您只想替换第一个发出的事件。

e、 g.对于一个订阅,以下逻辑:

boolean firstTimeA = true;

myCustomObservable.subscribe(s -> {
   System.out.println(firstTimeA ? "initEvent" : s.toString());
   if(firstTimeA) firstTimeA = false;
});

由于您想拥有第二个订阅,只需创建firstTimeB并将其更新为您的B订阅。

公孙阳文
2023-03-14

你要找的是PublishSubject。受试者是热门的可观察对象,因为他们不会等到观察者订阅后才开始发出他们的项目。这里有一些关于主题的信息。

这是您的用例的快速演示

    PublishSubject<String> subject = PublishSubject.create();
    Observable<String> InitEvent = Observable.just("init");
    Observable<String> A = subject.asObservable();
    Observable<String> B = subject.asObservable();

    subject.onNext("1");

    A.startWith(InitEvent)
            .subscribe(s -> System.out.println("A: " + s));

    subject.onNext("2");
    subject.onNext("3");
    subject.onNext("4");

    B.startWith(InitEvent)
            .subscribe(s -> System.out.println("B: " + s));

    subject.onNext("5");
邵崇凛
2023-03-14

很抱歉在两年后发布此消息,但我也有同样的需要,发现这个问题没有答案。

我所做的是:

public Observable<Event> observe() {
    return Observable.defer(() -> 
        subject.startWith(createInitialEvent())
    );
}

想法如下:

  • deer()在观察者订阅由观察()方法返回的可观察对象时执行传入的lambda表达式。所以基本上,它执行subject.start(...),它返回一个可观察对象,它是订阅者的实际事件源。
  • subject.startwith(...)发出一个初始事件(由start To(...)指定),后跟主题发出的事件。

因此,如果我回到原来的帖子:如果观察者在事件1,2之间启动它的订阅,那么它应该接收以下事件:InitialEvent,2,3,4,5。

 类似资料:
  • 我正在使用AngularFire作为Angular11上firebase的API。 我的应用程序的域名是实时拍卖 理想情况下,我想做的是阅读所有文档,然后订阅每个文档以进行更改。 我目前的问题是我在firestore上的阅读次数。 我的收藏阅读将产生N次阅读。但订阅每个文档会产生额外的读取,因此默认情况下会有2N次读取,这似乎是不可避免的。 但我想这比在集合上留下订阅并在每次更新集合中的内容时接收

  • 我将在一个Android应用程序中用替换模式。我有事件来提醒任何感兴趣的方面我的缓存中的数据更新单例。任何时候调用web服务,都将更新数据,并通过发布的事件向订阅者发出警报。 我在RxJava中使用设置了与此类似的内容。观察者从subject获得单个事件,但随后获得事件并取消订阅。这在UI第一次加载时起作用,但当需要刷新数据时,不会通知订阅者。如何告诉这些继续监听下一个事件?

  • 可将PS Vita的开始画面恢复为购买时的状态。 轻触[初始化]>[初始化开始画面的图像]>[初始化]。

  • 据我所知,在Java11中,这两个操作可以在一行中完成,不是吗?

  • 我正在学习RxJava,已经阅读了几篇文章和视频。我对RxJava所能提供的东西感到非常棒,所以我认为目前我已经了解了反应式编程的含义。Dan Lew的这篇教程在一定程度上帮助我理解了使用RxJava的基础知识。但我发现,我越是认为自己已经完全理解RxJava,我脑海中浮现的问题就越多。 由于我是一个在编写代码时学得最多的人,下面是我要做的。我已经有了一个利用SQLite的应用程序。我的应用程序有

  • 问题内容: 我正在使用RxJava计算Android中某些传感器数据的标准化自动相关性。奇怪的是,我的代码引发了一个异常(“ java.lang.IllegalStateException:只允许一个订阅者!”),我不确定该怎么做:我知道GroupedObservables订阅多个订阅者时可能会抛出此异常,但是我不认为我在任何地方都在使用这种东西。 在下面,您找到(最有可能)触发异常的方法: 这是