取消 运行 Completable (RX2) 的最佳方法是什么?
What is the best way to cancel running Completable (RX2)?
取消从 UI 到 RX2 Completable 的长 运行ning 操作的最佳方法是什么?
我有以下代码:
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) {
//...
}
});
离开时 UI
disposable.dispose()
被调用。
在 dispose() 之后,我不会在 Observer 中接收事件 (onComplete/onError),但是长时间的 运行ning 任务将继续 运行。
似乎应该将 "isInterrupted" 标志添加到 LongTaskManager(如 java.lang.Thread 中),它应该在离开 UI 时设置并在 LongTaskManager#doLongTask() 中处理。
但我不确定在使用 Rx 时这是正确的方法,并想澄清这方面。
Observable
/Completable
将向您正在执行订阅的线程发送线程中断信号,因此停止操作取决于 doLongTask()
究竟做了什么,以及是否确实如此它在订阅线程上或将工作分叉到其他线程。
此外,如果您的操作可以是 cancelled/stopped,您可以而且应该提供 Cancellation/Disposable 逻辑,这可以使用 Emitter.setCancellable()
/setDisposable()
来完成,请参阅其他信息.
取消从 UI 到 RX2 Completable 的长 运行ning 操作的最佳方法是什么?
我有以下代码:
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) {
//...
}
});
离开时 UI
disposable.dispose()
被调用。
在 dispose() 之后,我不会在 Observer 中接收事件 (onComplete/onError),但是长时间的 运行ning 任务将继续 运行。
似乎应该将 "isInterrupted" 标志添加到 LongTaskManager(如 java.lang.Thread 中),它应该在离开 UI 时设置并在 LongTaskManager#doLongTask() 中处理。
但我不确定在使用 Rx 时这是正确的方法,并想澄清这方面。
Observable
/Completable
将向您正在执行订阅的线程发送线程中断信号,因此停止操作取决于 doLongTask()
究竟做了什么,以及是否确实如此它在订阅线程上或将工作分叉到其他线程。
此外,如果您的操作可以是 cancelled/stopped,您可以而且应该提供 Cancellation/Disposable 逻辑,这可以使用 Emitter.setCancellable()
/setDisposable()
来完成,请参阅其他信息