取消运行Completable(RX2)的最佳方法是什么?

时间:2017-07-03 16:47:54

标签: rx-java rx-android

取消从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时它是否正确,并且想澄清这些方面。

1 个答案:

答案 0 :(得分:1)

Observable / Completable会将线程中断信号发送到您正在执行订阅的线程,因此停止操作取决于doLongTask()确实执行的操作,以及是否执行此操作订阅线程或将工作分叉到其他一些线程。

除此之外,如果您的操作可以明确取消/停止,您可以而且应该提供取消/一次性逻辑,这可以使用Emitter.setCancellable() / setDisposable()来完成,请参阅其他信息here