RxJava:在onNext中调用unsubscribe
我想知道这样从RxJava:在onNext中调用unsubscribe,java,rx-java,Java,Rx Java,我想知道这样从onNext处理程序中调用unsubscribe是否合法: List<Integer> gatheredItems = new ArrayList<>(); Subscriber<Integer> subscriber = new Subscriber<Integer>() { public void onNext(Integer item) { gatheredItems.add(item);
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);
然后收集所有的一百个元素。我无法控制可观察的源代码(无论它是否缓存),因此如何明确地从onNext
中取消订阅
顺便说一句:那么在onNext
内取消订阅是错误的吗
(我的实际用例是,在onNext
中,我实际上在向输出流写入数据,当IOException
发生时,无法再向输出写入任何内容,因此我需要以某种方式停止进一步处理。)缓存()一旦第一个订户到达,它就会缓存所有内容,并且不会提供任何选项来阻止它从下游进入。您需要在缓存()之前停止流,以避免保留过多:
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();
可观测源=可观测范围(1100);
PublishSubject停止=PublishSubject.create();
来源
.doOnNext(v->System.out.println(“生成”+v))
.takeUntil(停止)
.cache()
.doOnNext(新行动1){
int调用;
@凌驾
公共无效调用(整数t){
系统输出打印项次(“保存”+t);
如果(++调用==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));
SerialSubscription ssub=new SerialSubscription();
可连接可观测co=源
.doOnNext(v->System.out.println(“生成”+v))
.replay();
co.doOnNext(v->{
系统输出打印项次(“保存”+v);
如果(v==3){
取消订阅();
}
})
.subscribe();
co.connect(v->ssub.set(v));
此代码无法按预期工作,它会打印100次“生成”,然后打印100次“保存”。我只会“保存”四次。我在发布示例之前运行了我的示例,所以它每行打印3行。你是一字不差地尝试过它,还是尝试过将它插入到流中?我使用了你的示例,只是添加了main和imports。我在两台不同的计算机上运行了JavaRX1.0.12,它总是打印“保存”数百次。
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));