2010-10-06 7 views
3

Bonjour Je construis une application qui va exécuter un bloc de code à des périodes fixes (par exemple toutes les 30 minutes). Je voudrais que cette période soit stricte, ce que je veux dire, c'est que je voudrais être assuré que la période sera de 30 minutes et non de 28 minutes ou chaque fois que l'on veut l'exécuter.android question timer

J'ai un objet Timer et l'utiliser comme suit:

timer=new Timer(); timer.scheduleAtFixedRate(new GetLastLocation(), 0, this.getInterval()); où GetLastLocation est la classe de gestionnaire Wich étend TimerTask. Cela fonctionne bien, mais je voudrais pouvoir changer l'intervalle, ce que je fais actuellement utilise timer.scheduleAtFixedRate deux fois et en changeant le paramètre d'intervalle pour dire un newInterval mais je pense que cela fait juste exécuter deux timers chaque intervalle et nouveau Interval maintenant, ai-je raison?

également j'ai essayé d'annuler le temporisateur, puis d'utiliser la méthode scheduleAtFixedRate() mais cela déclenche une exception comme indiqué dans la documentation.

Que puis-je faire pour résoudre ce problème? concernes maxsap

Répondre

5

Vous ne pouvez pas planifier un minuteur qui a déjà été annulé ou planifié. Vous devez créer une nouvelle minuterie pour cela.

Timer timer; 
synchronized void setupTimer(long duration){ 
    if(timer != null) { 
    timer.cancel(); 
    timer = null; 
    } 
    timer = new Timer(); 
    timer.scheduleAtFixedRate(new GetLastLocation(), 0, duration); 
}
Vous pouvez maintenant appeler setupTimer chaque fois que vous voulez changer la durée du minuteur.
PS: Dans fixed-rate execution, chaque exécution est planifiée par rapport à l'heure d'exécution planifiée 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é de fond), deux exécutions ou plus se produiront rapidement pour "rattraper". À long terme, la fréquence d'exécution sera exactement la réciproque de la période spécifiée (en supposant que l'horloge système sous-jacente Object.wait (long) est exacte).

1

Définissez votre tâche dans une TimerTask (comme vous l'avez fait) et programmez la minuterie.

public final void checkFunction(){ 
    t = new Timer(); 
    tt = new TimerTask() { 
     @Override 
     public void run() { 
      //Execute code... 
     } 
    }; 
    t.schedule(tt, 10*1000); /* Run tt (your defined TimerTask) 
    again after 10 seconds. Change to your requested time. */ 
} 

Juste la fonction execute où vous voulez, par exemple dans onCreate ou onResume/onStart.

0

Vous pouvez également utiliser handler au lieu de timertask.

Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     if(what.msg==1) 
     { 
      what.msg==2; 
     }  
    } 
}; 
mHandler.sendEmptyMessageDelayed(1, 10* 1000);//10*1000 10 sec.specify your time