Java 是否在所有事件后或每次事件后通知订阅者?
我是RxJava新手,我的印象是,每次事件都会通知每个订阅者。因此,如果我们有N个订阅者和X个事件流,那么N个订阅者中的每一个的Java 是否在所有事件后或每次事件后通知订阅者?,java,observable,rx-java,reactive-programming,rx-java3,Java,Observable,Rx Java,Reactive Programming,Rx Java3,我是RxJava新手,我的印象是,每次事件都会通知每个订阅者。因此,如果我们有N个订阅者和X个事件流,那么N个订阅者中的每一个的onNext都将被调用。但当我运行以下代码时: public static void main(String[] args) { Observable<String> source = Observable.create(emitter -> { emitter.onNext("Hello")
onNext
都将被调用。但当我运行以下代码时:
public static void main(String[] args) {
Observable<String> source = Observable.create(emitter -> {
emitter.onNext("Hello");
emitter.onNext("Foo");
emitter.onNext("Bar");
emitter.onNext("RxJava");
});
source.subscribe(e -> System.out.println("Observer 1: " + e));
source.subscribe(e -> System.out.println("Observer 2: " + e));
}
因此,基本上,在完成所有的onNext
之后,下一个观察者才会被触发
我希望看到:
Observer 1: Hello
Observer 2: Hello
Observer 1: Foo
Observer 2: Foo
Observer 1: Bar
Observer 2: Bar
Observer 1: RxJava
Observer 2: RxJava
在我看来,这对于很长的流来说效率很低,我做错了什么吗?RxJava序列默认是同步的,因此上面的subscribe调用将在那里运行您的发射代码。为了实现交错,您需要一种方法来告诉源何时两个消费者都准备好接收。这可以通过以下几种方式实现:
ConnectableObservable源=可观测。创建(发射器->{
emitter.onNext(“你好”);
emitter.onNext(“Foo”);
发射器.onNext(“条”);
onNext(“RxJava”);
}).publish();
source.subscribe(e->System.out.println(“观察者1:+e”);
订阅(e->System.out.println(“观察者2:+e”);
source.connect();
或
ConnectableObservable源=可观测。创建(发射器->{
emitter.onNext(“你好”);
emitter.onNext(“Foo”);
发射器.onNext(“条”);
onNext(“RxJava”);
}).publish().refCount(2);
source.subscribe(e->System.out.println(“观察者1:+e”);
订阅(e->System.out.println(“观察者2:+e”);
RxJava序列默认情况下是同步的
是的,但我想到的是对每个字符串的所有观察者进行顺序循环,因此不涉及并发性。您能详细说明这两种方法的作用吗?我对RxJavaI是完全陌生的,我想它应该是(订阅者:subscribers)subscribe.next(value)的for(订阅者:subscribers)
为每个值调用connect
和refcount
在publish
上究竟做了什么?connect
:允许您在要求可观察对象发出之前排列观察者refCount
在有一定数量的观察者准备就绪时建立此连接publish
为每个观察者执行该操作,而无需多次运行observable。
Observer 1: Hello
Observer 2: Hello
Observer 1: Foo
Observer 2: Foo
Observer 1: Bar
Observer 2: Bar
Observer 1: RxJava
Observer 2: RxJava