1
取消從UI到RX2的長時間運行操作的最佳方法是什麼?什麼是取消正在運行Completable(RX2)的最佳方法?
我有如下代碼:
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)中接收事件,但長時間運行的任務將繼續運行。
似乎「isInterrupted」標誌應加入LongTaskManager(如在java.lang.Thread中),應該在離開UI設置和LongTaskManager#doLongTask()處理。
但我不確定在使用Rx時它是正確的方式,並且想澄清這一方面。
謝謝你的回答,我有新的信息。但如果說實話我仍然不知道該怎麼辦=( 似乎我應該添加setCancellable,以便我的代碼看起來像這樣: 'final LongTask ltm = new LongTask(); e.setCancellable(new撤銷(){ @Override 公共無效取消()拋出異常{ ltm.interrupt();} }); ltm.doLongTask(); e.onComplete();'
中斷()方法會正確地停止我的任務(釋放資源等)
對嗎? –
是的,exac在這裏沒有魔法,你應該提供邏輯來阻止長時間運行的任務,Observable機制將確保執行這個邏輯。 – yosriz
聽起來不錯:) @yosriz,可能你知道一個鏈接,其中有關於setDisposable和setCancelable的區別的信息?不幸的是我找不到。如果我同時設置了'(e.setCancellable(new Cancellable()....); e.setDisposable(new Disposable()...)',那麼這兩個事件都發生在'disposable.dispose();'所以我不' t看到他們的行爲差異 –