2012-03-09 35 views
1

我使用调度程序来确保我的循环不会花太长时间,所以如果调度程序触发并结束循环,则退出循环。使用ScheduledExecutorService在Android中未计划预定任务

这是很简单的:

public void startSchedulerForTimeout() { 

    Log.i("x", "SCHEDULING TIMEOUT "); 
    timeoutForLoopReached = false; 
    scheduler.schedule(new Runnable() { 
    public void run() { 
     timeoutForLoopReached = true; 
     Log.i("x", "SET TIMEOUT FLAG "); 
     } 
    }, 10, TimeUnit.SECONDS); 
} 

所以在我的代码,我只是写:

startSchedulerForUSBMessageTimeout(); 
while (!done && !timeoutForLoopReached) { 
    ...do the loop stuff 
} 

为了确保当我再次运行循环,我需要预定任务不火去计划过时的任务(如果我在超时之前结束循环),以便新计时器将在新循环的开始处重新开始(而不是在第一次循环在第二次之间完成之后开始的旧计时器)循环执行)

如何取消调度尚未解雇的计划任务以避免此计划任务混淆?

非常感谢!

回答

5

使用ScheduledFuture

ScheduledExecutorService scheduledTaskExecutor = Executors.newScheduledThreadPool(1); 
Runnable longRunningTask = new Runnable(); 

// schedule long running task in 2 minutes: 
ScheduledFuture scheduleFuture = scheduledTaskExecutor.schedule(longRunningTask, 2, TimeUnit.MINUTES); 

... ... 
// At some point in the future, if you want to cancel scheduled task: 
scheduleFuture.cancel(true); 
... ... 
+0

超级 - 非常感谢。顺便说一句,如果所有这一切都在一个方法中,并且完整的方法在1分钟后退出。计划任务是否仍然存在,或者自方法完成后会自动死亡?另外,如果我取消相同的日程安排不止一次,这会造成问题吗?或者如果它已被取消(或执行),我需要跟踪吗? – user387184 2012-03-09 01:24:37

+0

顺便说一句,我刚退出应用程序,调试器不断打印 - 它看起来不像调试器输出的积压。所以即使我按下“返回”直到应用程序退出,该应用程序仍继续运行?奇怪,不是吗? – user387184 2012-03-09 01:35:14

+0

@ user387184 1.计划任务不会自动终止。使用ScheduledExecutorService.shutdownNow()来终止所有正在运行和等待的任务。 2.检查cancel()方法API:_Attempts 3.取消执行此任务。如果任务已经完成,已经被取消或者因其他原因而无法取消,则此尝试将失败。3.检查API,还有许多其他有用的API,从ScheduledFuture类getDelay(),isCancelled( )等等 – yorkw 2012-03-09 01:35:44

1

schedule的全部覆盖返回ScheduledFuture这是一个Future它有一个cancel方法。

+0

请您提供一小段代码? – user387184 2012-03-09 01:12:20