取消从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" flag应该添加到LongTaskManager(就像在java.lang.Thread中一样),它应该在离开UI时设置并在LongTaskManager#doLongTask()中处理。
但是我不确定使用Rx时它是否正确,并且想澄清这些方面。
答案 0 :(得分:1)
Observable
/ Completable
会将线程中断信号发送到您正在执行订阅的线程,因此停止操作取决于doLongTask()
确实执行的操作,以及是否执行此操作订阅线程或将工作分叉到其他一些线程。
除此之外,如果您的操作可以明确取消/停止,您可以而且应该提供取消/一次性逻辑,这可以使用Emitter.setCancellable()
/ setDisposable()
来完成,请参阅其他信息here。