2010-05-26 5 views
2

J'utilise actuellement un minuteur et une minuterie pour effectuer un travail toutes les 30 secondes.Minuteur incrémental

Mon problème est qu'après chaque fois que je fais ce travail, je veux incrémenter l'intervalle de temps de la minuterie. Donc, par exemple, il commence avec 30 secondes entre le tir de la minuterie, mais je veux ajouter 10 secondes à l'intervalle, de sorte que la prochaine fois que le chronomètre prend 40 secondes avant qu'il se déclenche.

Voici mon code précédent:


public void StartScanning() { 

    scanTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 

          wifiManager.startScan(); 
          scanCount++;    
          if(SCAN_INTERVAL_TIME <= SCAN_MAX_INTERVAL){ 

           SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL; 
           t.schedule(scanTask, 0, SCAN_INTERVAL_TIME); 
          } 

         } 
       }); 
     }}; 
     Log.d("SCAN_INTERVAL_TIME ** ", "SCAN_INTERVAL_TIME ** = " + SCAN_INTERVAL_TIME); 
     t.schedule(scanTask, 0, SCAN_INTERVAL_TIME); 

} 

refactorisé CODE


@Override 
public void StartScanning() { 

     t.schedule(new ScanTask(),SCAN_INTERVAL_TIME); 

} 

class ScanTask extends TimerTask{ 

    @Override 
    public void run() { 
     wifiManager.startScan(); 
     scanCount++; 

     if(SCAN_INTERVAL_TIME < SCAN_MAX_INTERVAL) 
     SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL; 

     t.schedule(new ScanTask(), SCAN_INTERVAL_TIME); 
    } 


} 

Il fonctionne maintenant, mais crée une nouvelle ScanTask() chaque fois que le gaspillage?

Répondre

4

Voici comment je le ferais:

1) Planifier la tâche pour une seule exécution plutôt qu'une répétée une

2) A la fin de l'exécution (peut-être dans un bloc finally), planifiez une nouvelle exécution unique de la tâche, avec un délai plus long. Notez que vous devez créer une nouvelle instance de la tâche, sinon le temporisateur se plaindra (IllegalStateException). Cela signifie que vous ne pouvez plus utiliser une classe interne anonyme.

+0

Donc, je devrais recréer scanTask chaque fois que le Timer se déclenche? –

+1

@Donal: Selon le code ci-dessus, vous n'avez aucune initialisation lourde et aucun membre de données dans la classe ScanTask. Par conséquent, le temps de création d'une nouvelle instance toutes les 30 secondes devrait être minime ... La collecte des ordures traite les objets de courte durée très efficacement. –