2017-09-06 4 views
0

J'ai une fonction appuyer sur (int id) qui ouvre/ferme la porte selon qu'elle est ouverte/fermée et si la minuterie est activée ou désactivée. La façon dont cela fonctionne est:Je cours une fonction avec une nouvelle minuterie chaque fois que j'appuie sur un bouton; Je ne sais pas comment accéder à la minuterie à partir d'une presse précédente

La porte est fermée. Je l'enfonce une fois et il s'ouvre avec une minuterie de 5s qui fermera automatiquement la porte

Si j'appuie encore une fois, avant que la minuterie ne s'éteigne (toujours ouverte), la minuterie sera désactivée et la porte restera ouverte pour toujours

Si j'appuie encore une fois, alors que la porte est ouverte pour toujours, elle se ferme.

Le problème est que .. Je vais appuyer une fois. Cela fonctionne, et la minuterie est réglée. Cependant quand je l'appuie une deuxième fois, j'appelle t.cancel, mais cela n'annule pas la minuterie. Avec les erreurs qu'il donne (cas de test échoués), il est très clair que la minuterie se termine toujours, et ferme la porte à exactement 5 secondes. (J'ai essayé 50ms avant 5 secondes et il était ouvert, 50ms après 5 secondes il était fermé).

Je suppose que c'est parce que quand je cours Appuyez sur la deuxième fois, il crée une nouvelle minuterie t, et c'est la minuterie qui est annulée sur la deuxième presse. Comment puis-je annuler la première minuterie de presse afin qu'elle fonctionne comme je le souhaite? Petite note: J'ai déjà essayé d'extraire la minuterie et de l'utiliser comme variable pour l'objet qui appelle la pression, mais cela ne fonctionne pas (j'ai testé pour vérifier) ​​car apparemment si vous appelez annuler sur une minuterie, vous ne pouvez pas le réactiver, vous devez en créer un nouveau. Ainsi, il doit rester dans la fonction presse (int).



Code de la fonction:

public void press(int id) { 

    Timer t2 = new Timer(); 
    if (okIds.contains(id)) {// if the remote is accepted by the door 

     // if the delay is set to 0 the door stays open 
     // timer is not enabled (disabled by default) 
     if (!isOpen() && CLOSE_DELAY == 0) { 
      controller.open(); 
     } 
     // if the delay is set to a viable number and the door is closed 
     // open the door, enable the delay, set timer to the given time 
     else if (!isOpen() && CLOSE_DELAY >= 0) { 
      System.out.println("space 1"); 
      controller.open(); 
      isTimerEnabled = true; 
      t2.schedule(new TimerTask() { 
       public void run() { 
        controller.close(); 
        t2.cancel(); 
       } 
      }, CLOSE_DELAY); 
     } 
     // now all cases for the door being closed is handled. 


     // if the door is open, while the timer is enabled (timer running) 
     // we disable the timer and keep the door open. 
     else if (isOpen() && isTimerEnabled) { 
      System.out.println("space 2"); 
      try{ 
       t2.cancel(); 
      } 
      catch(Exception e){ 
       System.out.print("catch"); 
      } 
      //t.purge(); 
      // door should still be open. do not need to re-open 
      controller.open(); 
      isTimerEnabled = false; 

     } 
     // if the door is open, while the timer is disabled (open forever) 
     // we just close the door 
     // then reset the timer for the next press 
     else if (isOpen() && !isTimerEnabled) { 
      System.out.println("space 3"); 
      controller.close(); 
      isTimerEnabled = true; 
     } 
    } 

Répondre

0

Vous devez avoir « t2 » être une variable de classe, et vous devez créer un nouveau droit de la minuterie avant de planifier appeler là-dessus .

t2 = new Timer(); 
t2.schedule(new TimerTask() { 
      public void run() { 
       controller.close(); 
       t2.cancel(); 
      } 
     }, CLOSE_DELAY);