Я пишу приложение для Android, которое записывает аудио каждые 10 минут. Я использую таймер для этого. Но в чем разница между расписанием и расписаниемAtFixedRate? Есть ли преимущество в производительности при использовании одного над другим?
Расписание таймера Android vs scheduleAtFixedRate
Ответ 1
Разницу лучше всего объяснить эту документацию, отличную от Android:
Таймеры с фиксированной скоростью (scheduleAtFixedRate()
) основаны на времени начала (поэтому каждая итерация будет выполняться в startTime + iterationNumber * delayTime
).
При выполнении с фиксированной ставкой каждое исполнение запланировано относительно запланированного времени выполнения первоначального выполнения. Если исполнение задерживается по какой-либо причине (например, сбор мусора или другая фоновая активность), два или более исполнения будут выполняться в быстрой последовательности, чтобы "догнать".
Таймеры с фиксированной задержкой (schedule()
) основаны на предыдущем выполнении (поэтому каждая итерация будет выполняться в lastExecutionTime + delayTime
).
При выполнении с фиксированной задержкой каждое выполнение запланировано относительно фактического времени выполнения предыдущего выполнения. Если исполнение задерживается по какой-либо причине (например, сбор мусора или другая фоновая активность), последующие исполнения также будут отложены.
Кроме того, нет никакой разницы. Вы не найдете существенной разницы в производительности.
Если вы используете это в случае, когда хотите синхронизироваться с чем-то другим, вы захотите использовать scheduleAtFixedRate()
. Задержка от schedule()
может дрейфовать и ввести ошибку.
Ответ 2
Простой метод 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 секунд.
Ответ 3
Согласно java.util.Timer.TimerImpl.TimerHeap code
// 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;
btw Таймер не работает, когда экран выключен. Вы должны использовать AlarmManager.
Существует образец: http://developer.android.com/training/scheduling/alarms.html
Ответ 4
В случае расписания он выполняется только один раз, когда наступит соответствующее время. С другой стороны scheduleAtFixedRate имеет дополнительный параметр period, который содержит количество времени в миллисекундах между последующими исполнениями.
Более подробную информацию можно найти здесь
http://developer.android.com/reference/java/util/Timer.html#schedule(java.util.TimerTask, long)