我的用例是在视图组中单击监听器:
View都发布一个冷Observable<Click> API。Observable<ViewClick> API。我希望每个子视图在添加到可观察的复合视图时被订阅,但前提是复合有订阅。如果没有,则应该只在订阅复合时才订阅子节点。
到目前为止,我的解决办法是:
PublishSubject<ViewClick> composite;
Map<View, Subscription> subscriptions;
void addSource(View view, Observable<Click> clicks) {
Subscription s = clicks.map(click -> new ViewClick(view, click)
.subscribe(composite::onNext);
subscriptions.put(view, s);
}
void removeSource(View v) {
Subscription s = subscriptions.get(v);
s.unsubscribe;
subscriptions.remove(v);
}
Observable<ViewClick> compositeClicks() {
return composite;
}然而,这意味着clicks可观测值不再是冷的,因为它们被订阅了,而不管是否订阅了compositeClicks。
有更好的办法吗?
发布于 2015-09-21 08:43:17
您的困难来自于这样一个事实: addSource/removeSource不是反应性的,如果您将它们变成Rx流,它们就会逃脱。
实现这一目标的几种方法:
IObservable<IObservable<View>>中,内部可观测值在激活/添加时将有一个单独的onNext,而在删除时将具有onComplete。IObservable<View> x2 (一个用于添加,一个用于删除)IObservable<ViewActivationEvent> (带有添加/删除种类+视图实例的元组)(假设可以从视图中提取单击流,否则需要为激活部分提供一个元组view+clickStream来代替视图)
下面是使用上面的#2实现您的流的方式,但是所有方法都可以工作:
Subject<View> add,remove;
clicks = add.flatMap(view -> getClickObservable(view).takeUntil(remove.where(v => v == view)))发布于 2015-09-17 06:58:08
您需要一个特殊的“温暖”主题,比如BufferUntilSubscriber,它保存着源的可观察性,直到单个用户订阅了它。不幸的是,该类不是官方API的一部分,但是,2.0将有一个官方的UnicastSubject,其目的完全相同:
UnicastSubject<Observable<Integer>> inputs = UnicastSubject.create();
Observable<String> p = inputs
.flatMap(v -> v.map(u -> u.toString()))
.publish()
.autoConnect()
;
inputs.onNext(Observable.just(1)
.doOnSubscribe(s -> System.out.println("Subscribed to 1")));
inputs.onNext(Observable.just(2)
.doOnSubscribe(s -> System.out.println("Subscribed to 2")));
inputs.onNext(Observable.just(3)
.doOnSubscribe(s -> System.out.println("Subscribed to 3")));
System.out.println("Subscribing to p");
p.subscribe(System.out::println);https://stackoverflow.com/questions/32619393
复制相似问题