我有一个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,但似乎并非如此。我错过了什么?
答案 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。