我正在编写一个每 10 分钟录制一次音频的 Android 应用程序。我正在使用计时器来做到这一点。但是 schedule 和 scheduleAtFixedRate 有什么区别呢?使用其中一种是否有任何性能优势?
4 回答
这个非Android文档最好地解释了这种差异:
固定速率计时器 ( scheduleAtFixedRate()
) 基于开始时间(因此每次迭代都将在 执行startTime + iterationNumber * delayTime
)。
在固定速率执行中,每次执行都是相对于初始执行的计划执行时间安排的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟了执行,则会快速连续发生两次或更多执行以“赶上”。
固定延迟计时器 ( schedule()
) 基于先前的执行(因此每次迭代都将在 执行lastExecutionTime + delayTime
)。
在固定延迟执行中,每次执行都是相对于前一次执行的实际执行时间安排的。如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则后续执行也会延迟。
除此之外,没有任何区别。您也不会发现显着的性能差异。
如果您在想要与其他东西保持同步的情况下使用它,您将需要使用scheduleAtFixedRate()
. 延迟schedule()
会漂移并引入错误。
一个简单的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 秒时间间隔重复一次。
根据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
在计划的情况下,它仅在适当的时间到来时执行一次。另一方面scheduleAtFixedRate有一个额外的参数period包含后续执行之间的时间量(以毫秒为单位)。
更多信息可以在这里找到
http://developer.android.com/reference/java/util/Timer.html#schedule(java.util.TimerTask , long)