2012-01-07 98 views
0

我有一個後臺任務,我使用ScheduledThreadPoolExecutor以這樣的代碼運行。Android ScheduledThreadPoolExecutor立即執行延遲任務

executor.scheduleWithFixedDelay(new BackgroundSync(), 0, 15, TimeUnit.MINUTES); 

BackgroundSync實現了Runnable。

有時從用戶事件中,我希望延遲的事件現在運行,而不是當15分鐘計時器熄滅時。

一些要求:

  • 應該只有一個「BackgroundSync」位於關我應該能夠立即安排BackgroundSync如果尚未運行的用戶事件的時間
  • 運行。
+0

您如何區分什麼時候延遲運行和何時運行?基於什麼? – 2012-01-07 01:09:03

+0

澄清此重複任務是每15分鐘立即計劃一次。但是,如果用戶點擊某個按鈕,那麼我需要立即運行任務,假設它沒有運行。 – bluphoenix 2012-01-07 01:17:18

回答

2

scheduleWithFixedDelay返回一個ScheduledFuture。調用它時,將其存儲在某個地方,如果要立即執行,請檢查它是否存在。然後,您可以使用cancel方法取消預定的將來,並再次安排可立即執行的runnable。

2

卡布科的解決方案可能是你會得到的好,但有一個障礙。

cancel()方法返回true如果它開始前的任務被取消,並false如果任務已經運行,或者如果它之前被取消。問題是,如果任務當前正在運行,cancel()將返回true。因此,您需要實施其他一些機制來決定是否重新提交任務。

+0

我已經閱讀了Android的Java文檔我想知道這些未來的對象實際上如何處理重複任務。使用正常任務代表單線程任務的執行。這對我來說意味着什麼,但如果我取消了,我只取消當前的運行?或整個循環任務。 – bluphoenix 2012-01-07 05:15:14

+0

計劃任務不是重複性任務 - 它只是一個任務,將在指定的未來時間點之後或之後運行。您需要設計您的「重複任務」構建模塊,決定「取消()」要做什麼,以及如何實現它。 – 2012-01-09 05:27:53