防止每个订阅都运行一个Observable

问题描述:

由于我的误解,这是一个反应式编程的概念性问题,我想。防止每个订阅都运行一个Observable

我有一个Observable发出一个网络调用返回JSON,我filter(),看管理标志的JSON,然后在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()方法中,但我不确定这是否被动方式。

有没有一种方法可以保持上述结构,但只能将运动中的观察点设置为一次 - 即,一个网络电话不是两个?

看起来好像我想以多种方式对Observable的结果做出反应,而没有使Observable多次运行。

有两大类可观察量:hot and cold个。您所描述的一个可观察的事件,其生成部分在每个subscribe()呼叫上执行,被称为。另一方面,无论客户订阅还是取消订阅,observable通常都会发送项目。

为您的使用情况下,运营商的家庭可能是合适的:connectpublishshare

一个例子:

ConnectableObservable</*Your type*/> connectable = Observable.just(1, 2, 3).publish(); 

connectable 
    .filter((json) -> { return json.isAdmin; }) 
    .subscribe((json) -> { /* Do things for admin */ }); 

connectable 
    .filter((json) -> { return !json.isAdmin; }) 
    .subscribe((json) -> { /* Do things for non-admin */ }); 

connectable.connect(); // here's when sharedObservable starts emitting items 

有一个测试运营商autoConnect()自动连接到可观察的时候指定的客户端数目被订阅:

Observable<Integer> autoObservable = Observable.just(1, 2, 3).publish().autoConnect(2); 
autoObservable.subscribe(); 
autoObservable.subscribe(); // here's when autoObservable starts emitting items 

我不得不提到t他share()运营商也经常使用,并且是.publish().refCount()的快捷方式。从它的javadoc:

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

Observable<Integer> shared = Observable.just(1, 2, 3).share(); 
shared.subscribe(); // starts emitting here... 
shared.subscribe(); // ... but is not triggered again, only starts listening for new emissions 
// (potential race condition regarding the first emitted item) 
+0

谢谢。那好极了。我稍后会玩,但这看起来正是我所错过的。除了我看到的大量初学者教程外,您是否有关于如何更好地学习RxJava等的建议? – newfivefour

+0

@newfivefour我认为你已经走上了正确的轨道,询问这类问题。官方文档非常好。 [此操作员页面](http://reactivex.io/documentation/operators.html)非常棒,甚至有一个决策树可以帮助您在不同情况下选择合适的操作员。 [主体(http://reactivex.io/documentation/subject。html)(“热门”observables)也是一个重要的概念,强烈推荐阅读和使用。 – AndroidEx

+0

谢谢。该页面很有用。我必须在大理石图上找到我的头......再次感谢。 – newfivefour