Rx java 防止每个订阅的可观察运行

Rx java 防止每个订阅的可观察运行,rx-java,reactive-programming,Rx Java,Reactive Programming,我认为,这是由于我的误解而导致的反应式编程的概念问题 我有一个Observable,它发出一个返回JSON的网络调用,我filter(),查看JSON中的admin标志,然后在subscribe()方法中执行操作 observable .filter((json) -> { return json.isAdmin; }) .subscribe((json) -> { /* Do things for admin */ }); 我也想这样做,但当用户不是管理员时: observabl

我认为,这是由于我的误解而导致的反应式编程的概念问题

我有一个
Observable
,它发出一个返回JSON的网络调用,我
filter()
,查看JSON中的admin标志,然后在
subscribe()
方法中执行操作

observable
.filter((json) -> { return json.isAdmin; })
.subscribe((json) -> { /* Do things for admin */ });
我也想这样做,但当用户不是管理员时:

observable
.filter((json) -> { return !json.isAdmin; })
.subscribe((json) -> { /* Do things for non-admin */ });
我现在知道,如果我运行上述两个代码块,网络调用将被调用两次

我知道我可以将if语句放在一个
subscribe()
方法中,但我不确定这是否是被动方式

有没有一种方法可以让我保持上面的结构,但只设置一次运动中的可观察对象,即一次网络调用而不是两次


似乎我想以多种方式对一个
可观察的
的结果做出反应,而不是让该可观察的运行多次。

有两大类可观察的:一类。您描述的一个可观察对象,其生成部分在每次
subscribe()
调用时执行,称为cold。另一方面,无论客户是否订阅,热可观测通常都会发射项目

对于您的用例,一系列操作符可能是合适的:、等

例如:

ConnectableObservable-connectable=Observable.just(1,2,3).publish();
可连接
.filter((json)->{return json.isAdmin;})
.subscribe((json)->{/*为管理员做事*/});
可连接
.filter((json)->{return!json.isAdmin;})
.subscribe((json)->{/*为非管理员做事*/});
connectable.connect();//以下是sharedObservable开始发送项目的时间
有一个beta操作符
autoConnect()
,当订阅指定数量的客户端时,它会自动连接到可观察对象:

Observable autoObservable=Observable.just(1,2,3).publish().autoConnect(2);
autoObservable.subscribe();
autoObservable.subscribe();//此时autoObservable开始发射项目
我必须提到
share()
操作符,它也是经常使用的,是
.publish().refCount()
的快捷方式。从其javadoc:

返回多播(共享)原始可观察对象的新可观察对象。只要至少有一个订阅者,这个可观察的将被订阅并发送数据。当所有订户都取消订阅时,它将从可观察的源取消订阅

Observable shared=Observable.just(1,2,3).share();
shared.subscribe();//开始在这里发射。。。
shared.subscribe();/。。。但不会再次触发,只会开始监听新的排放
//(关于第一个排放项目的潜在竞争条件)

谢谢。太好了。稍后我会有一场比赛,但这看起来正是我错过的。除了我看到的大量初学者教程外,你对如何更好地学习RxJava等有什么建议吗?@newfivefour我认为你提出这类问题已经走上了正轨。官方文件很好。很好,甚至有一个决策树可以帮助您在不同情况下选择合适的操作员。(“热”观测值)也是一个重要概念,强烈建议阅读和使用。谢谢。那一页很有用。我得先弄清楚大理石图。。。再次感谢。