Android计时器计划与scheduleAtFixedRate

时间:2012-10-02 04:37:26

标签: java android multithreading timer scheduled-tasks

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

4 个答案:

答案 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,长)