Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:在onNext中调用unsubscribe_Java_Rx Java - Fatal编程技术网

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));