2017-07-03 93 views
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時它是正確的方式,並且想澄清這一方面。

回答

1

Observable/Completable將發送線程中斷信號,你在執行訂閱的線程,因此停止操作取決於什麼doLongTask()究竟,並且如果這樣做,認購線程或叉子工作,其他線程。

除此之外,你可以和應該提供取消/一次性邏輯,如果你的操作可被取消/停止明確,這可以通過使用Emitter.setCancellable()/setDisposable()來完成,查看其他信息here

+1

謝謝你的回答,我有新的信息。但如果說實話我仍然不知道該怎麼辦=( 似乎我應該添加setCancellable,以便我的代碼看起來像這樣: 'final LongTask ltm = new LongTask(); e.setCancellable(new撤銷(){ @Override 公共無效取消()拋出異常{ ltm.interrupt();} }); ltm.doLongTask(); e.onComplete();'
中斷()方法會正確地停止我的任務(釋放資源等)
對嗎? –

+0

是的,exac在這裏沒有魔法,你應該提供邏輯來阻止長時間運行的任務,Observable機制將確保執行這個邏輯。 – yosriz

+1

聽起來不錯:) @yosriz,可能你知道一個鏈接,其中有關於setDisposable和setCancelable的區別的信息?不幸的是我找不到。如果我同時設置了'(e.setCancellable(new Cancellable()....); e.setDisposable(new Disposable()...)',那麼這兩個事件都發生在'disposable.dispose();'所以我不' t看到他們的行爲差異 –

相關問題