取消从 UI 到 RX2 Completable 的长时间运行操作的最佳方法是什么?
我有以下代码:
Completable completable = Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(@NonNull CompletableEmitter e) throws Exception {
final LongTaskManager ltm = new LongTaskManager();
ltm.doLongTask();
e.onComplete();
}
}.subscribeOn(Schedulers.computation());
Disposable disposable = completable.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
//...
}
@Override
public void onError(@NonNull Throwable e) {
//...
}
});
离开界面
disposable.dispose()
被调用。
在 dispose() 之后,我不会在 Observer 中接收到事件 (onComplete/onError),但是长时间运行的任务会继续运行。
似乎“isInterrupted”标志应该添加到 LongTaskManager(就像在 java.lang.Thread 中一样),它应该在离开 UI 时设置并在 LongTaskManager#doLongTask() 中处理。
但我不确定在使用 Rx 时这是正确的方法,并想澄清这方面。
最佳答案
Observable
/Completable
将向您正在执行订阅的线程发送线程中断信号,因此停止操作取决于 doLongTask()
确实如此,如果它在订阅线程上执行或将工作 fork 到其他线程。
此外,如果您的操作可以显式取消/停止,您可以而且应该提供取消/一次性逻辑,这可以使用 Emitter.setCancellable()
/setDisposable()
,查看更多信息 here .
关于rx-java - 取消运行 Completable (RX2) 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44890582/