当DisposableSubscriber处理时,不调用RxJava 2,Flowable.doOnCancel

时间:2017-11-14 21:25:35

标签: java rx-java rx-java2

我有一个DisposableSubscriber到Flowable。 Flowable运行一段时间UntilTimeout,但在某些情况下我需要先杀死它。现在我在DisposableSubscriber上调用.dispose()但Flowable继续发出事件。最终会调用Flowable超时和.doOnCancel()。

我有以下代码:

private Disposable mDisposableSubscription = null;

public void start() {
    mDisposableSubscription = getFlowable()
            .timeout(timeUntilTimeout, TimeUnit.MILLISECONDS)
            .subscribeWith(new DisposableSubscriber<T>() {
                @Override
                public void onComplete() {

                }
                @Override
                public void onError(Throwable throwable) {
                    dispose();
                }
                @Override
                public void onNext(T t) {
                    // Do something
                }
            });
}

public void stop() {
    // Log "dispose"
    mDisposableSubscription.dispose();
}

private Flowable<T> getFlowable() {
    return Flowable.create(new FlowableOnSubscribe<T>() {
        public void subscribe(FlowableEmitter<T> emitter) {
            startSomeAsyncProcess();
        }
    }).doOnCancel(new Action() {
        public void run() {
            // Log "do on cancel"
            stopSomeAsyncProcess();
        }
    });
}

在Flowable超时之前调用stop()处理DisposableSubscriber意味着不再处理Flowable发出的事件,但Flowable继续发出事件并且异步进程继续运行。我的印象是,在Flowable下游调用.dispose()会通过调用.doOnCancel()来杀死Flowable,但似乎并非如此。我错过了什么?

1 个答案:

答案 0 :(得分:1)

可流动性正在被处理掉,但你没有在Flowable.create函数上检查它,所以会发生startSomeAsyncProcess()忽略它并继续前进。

要解决此问题,您应该检查emitter.isDisposed()标志以了解是否应该停止发射。

示例:

Flowable<T> getFlowable() {
    return Flowable.create(new FlowableOnSubscribe<T>() {

        public void subscribe(FlowableEmitter<T> emitter) {
            while(!emitter.isDisposed()) {
                emitter.onNext(...);
            }
        }

    });
}

如果startSomeAsyncProcess()函数不允许您检查标志,肯定有一些方法可以取消它。然后你可以附上一个可取消的:

Flowable<T> getFlowable() {
    return Flowable.create(new FlowableOnSubscribe<T>() {

        public void subscribe(FlowableEmitter<T> emitter) {
            startSomeAsyncProcess();
            emitter.setCancellable(() -> stopSomeAsyncProcess());
            // I don't remember if it's setCancellable() or setDisposable()
        }

    });
}

更新:方法setCancellable(...)setDisposable(...)的行为应该相同,they just take different arguments