防止每个订阅都运行一个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通常都会发送项目。
为您的使用情况下,运营商的家庭可能是合适的:connect,publish,share等
一个例子:
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)
谢谢。那好极了。我稍后会玩,但这看起来正是我所错过的。除了我看到的大量初学者教程外,您是否有关于如何更好地学习RxJava等的建议? – newfivefour
@newfivefour我认为你已经走上了正确的轨道,询问这类问题。官方文档非常好。 [此操作员页面](http://reactivex.io/documentation/operators.html)非常棒,甚至有一个决策树可以帮助您在不同情况下选择合适的操作员。 [主体(http://reactivex.io/documentation/subject。html)(“热门”observables)也是一个重要的概念,强烈推荐阅读和使用。 – AndroidEx
谢谢。该页面很有用。我必须在大理石图上找到我的头......再次感谢。 – newfivefour