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

标签 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”标志应该添加到 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/

相关文章:

java - RxAndroid : UI changes on Schedulers. io() 线程

java - 如何使请求 header 在 rxJava 线程中可用?在新线程中注入(inject) HttpServletRequest 不起作用

android - RxAndroid上传多个文件成功存入DB

android - 如何为单元测试选择正确的调度程序

android - 如何过滤Livedata或Rxjava flowable

java - RxJava - 嵌套的 Observables? ( retrofit )

java - 使用 RXJava 2 异步读/写 Realm

java - 使用 Fallback Observable x 次

rx-java - 使用 RXJava 防止快速点击

java - Android + RxJava + For Loop + 不执行所有请求