logo
Formation,
conseil
et développement
informatique
Formation,
conseil
et développement
informatique
www.pnguepard.com

Sortie de l'outil online PNGuepard qui permet d'optimiser vos PNG pour entre autre :
- Gagner de la place (espace limité, mail, document word, document PDF),
- Gagner en vitesse d'affichage
 
Faites un tour et adoptez notre gentil félin
 
Cédric

pub du site de Teretwen
Le Timer

Comme on a pu le voir précédemment, Flex s'appuie sur une gestion événementielle pour répondre au besoin de l'application. De ce fait une application est totalement threadée et parallélisée. Cela a pour conséquence qu'il n'existe pas de thread en AS3. En revanche pour faire des tâches de manière périodique, comme envoyer des informations ou rafraîchir des informations, il existe un objet : Timer (flash.utils.Timer).

Le fonctionnement du Timer est simple puisqu'il s'appuie sur la notion de nombre de répétitions et du délai entre chaque.

Déclarons donc un Timer qui se déclenchera 10 fois et ce toutes les secondes :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initTimer()">
<mx:Script>
<![CDATA[
private var timer:Timer;

private function initTimer():void
{
timer = new Timer(1000, 10);
}
]]>
</mx:Script>
</mx:Application>

« Il est déclaré et alors ? »

Et alors il ne fonctionne pas, ne fait rien. Il est vrai que nous n'avons rien fait dans ce sens. Pour cela il est bon de mettre en place les bons écouteurs.

Le Timer est tout ouïe

Le Timer, quand il doit être déclenché ou quand il arrive à terme, reçoit des événements de la classe TimerEvent (flash.events.TimerEvent). Le TimerEvent.TIMER est le type d'événement déclenché périodiquement et le TimerEvent.TIMER_COMPLETE est celui déclenché en fin de vie du Timer.

Attachons donc méthode onTimer pour les événements de type TimerEvent.TIMER et onTimerComplete pour l'événement TimerEvent.TIMER_COMPLETE :

...

private function onTimer(event:TimerEvent):void
{
}

private function onTimerComplete(event:TimerEvent):void
{
}

private function initTimer():void
{
timer = new Timer(1000, 10);
timer.addEventListener(TimerEvent.TIMER, onTimer);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
}

...

« Certes, certes, mais ça fait quoi ? »

Pour l'instant rien et toujours rien. On va donc rajouter un peu de code dans nos fonctions afin de rendre notre test plus vivant.

import mx.controls.Alert;

...

private function onTimer(event:TimerEvent):void
{
Alert.show("Appel n°" + Timer(event.currentTarget).currentCount);
}

private function onTimerComplete(event:TimerEvent):void
{
Alert.show("Le Timer a fini");
}

On peut voir en passant que le currentTarget de notre événement est notre Timer. On notera aussi l'utilisation de la propriété currentCount de notre Timer pour avoir le numéro de l'itération actuelle de notre Timer. Cette propriété n'est accessible qu'en lecture seule.

En résumé notre fonction onTimer affichera le numéro de notre appel actuel et l'autre fonction onTimerComplete affichera le fait que le Timer a fini son travail.

« Bien ça fait tout ça, mais quand je lance mon application je ne vois rien »

Et c'est normal...

Y-a-t-il un pilote dans l'application ?

… car on déclare, on déclare mais c'est tout. Il faut effectivement demander au Timer de commencer son travail et pour cela faire appel à sa méthode start.

private function initTimer():void
{
timer = new Timer(1000, 10);
timer.addEventListener(TimerEvent.TIMER, onTimer);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
timer.start();
}

Et là tout fonctionne :

Boite d'alerte sur un Timer.EventTIMER.

Même à la fin :

Boite d'alerte sur un TimerEvent.TIMER_COMPLETE.

« … et le pilote ? »

Ah oui le pilote … nous pouvons faire autre chose que demander au Timer de démarrer. On peut aussi lui demander de s’arrêter à l'aide de sa méthode stop ou encore de se réinitialiser avec sa méthode reset.

D'ailleurs si nous modifions notre méthode onTimer pour que le Timer s’arrête au cinquième passage comme ceci :

private function onTimer(event:TimerEvent):void
{
Alert.show("Appel n°" + Timer(event.currentTarget).currentCount);

if (Timer(event.currentTarget).currentCount == 5)
{
Timer(event.currentTarget).stop();
Alert.show("J'aurai du continuer jusqu'à " +
Timer(event.currentTarget).repeatCount + " mais je m'arrête avant");
}
}

Nous pouvons constater que le message « J'aurai du continuer jusqu'à 10 mais je m’arrête avant » est le dernier message affiché et que l'on ne passe plus par la méthode onTimerComplete.

Alert affichée en même temps que le Timer est arrêté

Nous avons bel et bien arrêté le Timer dans son élan.

Conclusion

Le Timer est un objet utile pour pouvoir faire des tâches répétitives ou au bout d'un temps certain. Il s'appuie sur des événements qui sont émis par le Thread principal de l'application. A tout moment nous pouvons changer sa périodicité ou le nombre d'itération de notre Timer. Et pour finir nous pouvons le piloter à l'aide de ses méthodes start, stop et reset.

filigrane

©2011, levieuxcedric.com