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我认为你提出这类问题已经走上了正轨。官方文件很好。很好,甚至有一个决策树可以帮助您在不同情况下选择合适的操作员。(“热”观测值)也是一个重要概念,强烈建议阅读和使用。谢谢。那一页很有用。我得先弄清楚大理石图。。。再次感谢。