2012-01-07 100 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