web-dev-qa-db-fra.com

Android Planification du minuteur vs ScheduleAtFixedRate

J'écris une Android qui enregistre l'audio toutes les 10 minutes. J'utilise un minuteur pour le faire. Mais quelle est la différence entre la planification et la planificationAtFixedRate? Y a-t-il un avantage de performance à en utiliser une sur l'autre?

40
DXM

La différence s'explique mieux par cette documentation non Android :

Les minuteries à taux fixe (scheduleAtFixedRate()) sont basées sur l'heure de début (donc chaque itération s'exécutera à startTime + iterationNumber * delayTime).

Dans l'exécution à taux fixe, chaque exécution est planifiée par rapport au temps d'exécution planifié de l'exécution initiale. Si une exécution est retardée pour une raison quelconque (telle que la récupération de place ou toute autre activité en arrière-plan), deux exécutions ou plus se produiront rapidement pour "rattraper".

Les temporisateurs à retard fixe (schedule()) sont basés sur l'exécution précédente (donc chaque itération s'exécutera à lastExecutionTime + delayTime).

Dans l'exécution à délai fixe, chaque exécution est planifiée par rapport au temps d'exécution réel de l'exécution précédente. Si une exécution est retardée pour une raison quelconque (comme la récupération de place ou toute autre activité en arrière-plan), les exécutions suivantes seront également retardées.

Hormis cela, il n'y a aucune différence. Vous ne trouverez pas non plus de différence de performance significative.

Si vous utilisez ceci dans un cas où vous souhaitez rester synchronisé avec autre chose, vous voudrez utiliser scheduleAtFixedRate(). Le retard de schedule() peut dériver et introduire une erreur.

89
Eric

Une simple méthode schedule() s'exécutera en même temps tandis que la méthode scheduleAtFixedRate() prend et un paramètre supplémentaire qui est pour la répétition de la tâche encore et encore sur un intervalle de temps spécifique.

en regardant la syntaxe:

Timer timer = new Timer(); 
timer.schedule( new performClass(), 30000 );

Cela va se produire une fois que l'intervalle de 30 secondes est terminé. Une sorte d'action temporelle.

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 );

Cela va commencer après 1 seconde et se répète tous les 30 secondes.

15
Lucifer

Selon le code 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)

définira task.fixedRate = false;

Java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)

définira task.fixedRate = true;

btw Timer ne fonctionne pas lorsque l'écran est éteint. Vous devez utiliser AlarmManager.

Il y a un exemple: http://developer.Android.com/training/scheduling/alarms.html

1
Hugo