繁体   English   中英

RxJava:在onNext中调用取消订阅

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM