44

我正在编写一个每 10 分钟录制一次音频的 Android 应用程序。我正在使用计时器来做到这一点。但是 schedule 和 scheduleAtFixedRate 有什么区别呢?使用其中一种是否有任何性能优势?

4

4 回答 4

96

这个非Android文档最好地解释了这种差异:

固定速率计时器 ( scheduleAtFixedRate()) 基于开始时间(因此每次迭代都将在 执行startTime + iterationNumber * delayTime)。

在固定速率执行中,每次执行都是相对于初始执行的计划执行时间安排的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟了执行,则会快速连续发生两次或更多执行以“赶上”。

固定延迟计时器 ( schedule()) 基于先前的执行(因此每次迭代都将在 执行lastExecutionTime + delayTime)。

在固定延迟执行中,每次执行都是相对于前一次执行的实际执行时间安排的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则后续执行也会延迟。

除此之外,没有任何区别。您也不会发现显着的性能差异。

如果您在想要与其他东西保持同步的情况下使用它,您将需要使用scheduleAtFixedRate(). 延迟schedule()会漂移并引入错误。

于 2012-10-02T04:48:24.697 回答
21

一个简单的schedule()方法将立即执行,而scheduleAtFixedRate()方法需要和额外的参数,用于在特定时间间隔内再次重复任务。

通过查看语法:

Timer timer = new Timer(); 
timer.schedule( new performClass(), 30000 );

这将在 30 秒时间段间隔结束后执行一次。一种时间输出动作。

Timer timer = new Timer(); 
//timer.schedule(task, delay, period)
//timer.schedule( new performClass(), 1000, 30000 );
// or you can write in another way
//timer.scheduleAtFixedRate(task, delay, period);
timer.scheduleAtFixedRate( new performClass(), 1000, 30000 );

这将在 1 秒后开始,并每隔 30 秒时间间隔重复一次。

于 2012-10-02T04:43:49.583 回答
1

根据java.util.Timer.TimerImpl.TimerHeap代码

// this is a repeating task,
if (task.fixedRate) {
    // task is scheduled at fixed rate
    task.when = task.when + task.period;
} else {
    // task is scheduled at fixed delay
    task.when = System.currentTimeMillis() + task.period;
}

--

java.util.Timer.schedule(TimerTask task, long delay, long period)

将设置task.fixedRate = false;

java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

将设置task.fixedRate = true;

顺便说一句,屏幕关闭时计时器不起作用。您应该使用警报管理器。

有示例:http: //developer.android.com/training/scheduling/alarms.html

于 2015-05-12T08:45:05.953 回答
-1

计划的情况下,它仅在适当的时间到来时执行一次。另一方面scheduleAtFixedRate有一个额外的参数period包含后续执行之间的时间量(以毫秒为单位)。

更多信息可以在这里找到

http://developer.android.com/reference/java/util/Timer.html#schedule(java.util.TimerTask , long)

于 2012-10-02T04:44:41.690 回答