我正在编写一个每10分钟录制一次音频的Android应用程序。我正在使用Timer来做到这一点。但是schedule和scheduleAtFixedRate有什么区别?使用一个优于另一个是否有任何性能优势?
答案 0 :(得分:89)
差异最好由this non-Android documentation解释:
固定费率计时器(scheduleAtFixedRate()
)基于开始时间(因此每次迭代将在startTime + iterationNumber * delayTime
执行)。
在固定速率执行中,每次执行都是相对于初始执行的预定执行时间进行调度的。如果执行因任何原因(例如垃圾收集或其他后台活动)而延迟,则会快速连续执行两次或更多次执行以“赶上”。
固定延迟计时器(schedule()
)基于先前的执行(因此每次迭代都将在lastExecutionTime + delayTime
执行)。
在固定延迟执行中,每次执行都是相对于上一次执行的实际执行时间进行调度的。如果执行因任何原因(例如垃圾收集或其他后台活动)而延迟,则后续执行也将延迟。
除此之外,没有区别。您也不会发现显着性差异。
如果您希望与其他内容保持同步,则需要使用scheduleAtFixedRate()
。 schedule()
的延迟会漂移并引入错误。
答案 1 :(得分:15)
一个简单的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秒重复一次。
答案 2 :(得分:1)
根据 java.util.Timer.TimerImpl.TimerHeap 代码
.table {
min-width: 399px;
width: 100%;
max-width: 100%;
margin: 0 auto;
display: table;
}
.table-cell-left {
min-width: 0px;
max-width: 9999px;
width: 49%; //remove this
display: table-cell;
background-color:#933333;
color: #ffffff;
text-align: center;
vertical-align: middle;
padding: 0 0 0 0;
}
.table-cell-right {
min-width: 0px;
max-width: 9999px;
width: 49%; // remove this
display: table-cell;
background-color:#339933;
color: #ffffff;
text-align: center;
vertical-align: middle;
}
.table-cell-middle {
min-width: 399px;
max-width: 999px;
width: 2%; // remove this
display: table-cell;
text-align: center;
vertical-align: middle;
background-color:#333393;
color: #ffffff;
}
-
// 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)
btw当屏幕关闭时,计时器不起作用。 你应该使用AlarmManager。
有样本:http://developer.android.com/training/scheduling/alarms.html
答案 3 :(得分:-1)
如果计划,它只会在适当的时间到来时执行一次。另一方面, scheduleAtFixedRate 有一个额外的参数 period ,其中包含后续执行之间的时间量(以毫秒为单位)。
可在此处找到更多信息
http://developer.android.com/reference/java/util/Timer.html#schedule(java.util.TimerTask,长)