[英]RxJava: calling unsubscribe from within onNext
我想知道在onNext
处理程序中调用unsubscribe
是否合法是这样的:
List<Integer> gatheredItems = new ArrayList<>();
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
public void onNext(Integer item) {
gatheredItems.add(item);
if (item == 3) {
unsubscribe();
}
}
public void onCompleted() {
// noop
}
public void onError(Throwable sourceError) {
// noop
}
};
Observable<Integer> source = Observable.range(0,100);
source.subscribe(subscriber);
sleep(1000);
System.out.println(gatheredItems);
上面的代码正确输出只收集了四个元素: [0, 1, 2, 3]
。 但是如果有人将源observable更改为缓存:
Observable<Integer> source = Observable.range(0,100).cache();
然后收集所有一百个元素。 我没有对source observable的控制(无论是否缓存),那么如何在onNext
明确取消订阅?
BTW:那么取消订阅onNext
错误的事情呢?
(我的实际用例是onNext
我实际上是在写输出流,当发生IOException
时,不能onNext
其写入输出,所以我需要以某种方式停止进一步处理。)
一旦第一个订户到达,cache()将缓存所有内容,并且它不提供任何阻止其从下游停止的选项。 您需要在缓存()之前停止流以避免过多保留:
Observable<Integer> source = Observable.range(1, 100);
PublishSubject<Integer> stop = PublishSubject.create();
source
.doOnNext(v -> System.out.println("Generating " + v))
.takeUntil(stop)
.cache()
.doOnNext(new Action1<Integer>() {
int calls;
@Override
public void call(Integer t) {
System.out.println("Saving " + t);
if (++calls == 3) {
stop.onNext(1);
}
}
})
.subscribe();
编辑:上面的示例在1.0.13以下不起作用,所以这里应该是一个版本:
SerialSubscription ssub = new SerialSubscription();
ConnectableObservable<Integer> co = source
.doOnNext(v -> System.out.println("Generating " + v))
.replay();
co.doOnNext(v -> {
System.out.println("Saving " + v);
if (v == 3) {
ssub.unsubscribe();
}
})
.subscribe();
co.connect(v -> ssub.set(v));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.