Подтвердить что ты не робот

Расписание таймера Android vs scheduleAtFixedRate

Я пишу приложение для Android, которое записывает аудио каждые 10 минут. Я использую таймер для этого. Но в чем разница между расписанием и расписаниемAtFixedRate? Есть ли преимущество в производительности при использовании одного над другим?

4b9b3361

Ответ 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)