2016-01-07 2 views
0

Je fais une application qui dépend d'un utilisateur appuyant sur une touche et des événements basés sur le temps. Les méthodes fonctionneront dans deux circonstances:Comment exécutez-vous une des deux méthodes en continu quand elles s'exécutent indéfiniment et une basée sur un événement de pression de touche?

1: Si l'utilisateur appuie sur une touche, l'application imprime foo.

2: Si 3 secondes s'écoulent, l'application imprime la barre.

Le premier scénario s'exécute indépendamment de la seconde, mais le second dépend du premier. Le temporisateur de 3 secondes doit être réinitialisé chaque fois que le keypress event est appelé. Après l'exécution de l'une de ces deux méthodes, l'application doit retourner à l'état où l'application attend l'un de ces deux événements.

code pourrait ressembler à ce qui suit

@override 
public void onPress(int i){ 
    System.out.print("foo"); 
} 

public void printBar(){ 
    if(timeElapsed > 3){ 
     System.out.print("bar"); 
    } 
} 

Donc sur l'événement de presse devrait se produire normalement lorsque la touche est pressée, mais barre d'impression ne doit fonctionner 3 secondes après l'exécution la plus récente de la plus récente keyPress. Chaque exécution de keypress devrait réinitialiser le timer printBar. Merci pour votre aide et laissez-moi savoir si je peux fournir de meilleures informations. Permettez-moi de vous donner une idée générale de la façon de procéder.

+0

Multithreading avec un verrou. – horatius

+0

Vous étiquetez cette question avec [tag: android], mais vous écoutez les événements de la touche. Cela n'a aucun sens pour moi. Les téléphones Android n'ont pas de clés, non? – Sweeper

+0

Je crée mon propre clavier, donc la touche fait référence à une touche du clavier. Je n'ai pas inclus ce clavier dans la description parce que je pensais que la question généralisée atteignait encore ce que je demandais – Danny2036

Répondre

1

Je suppose que votre méthode keypress fonctionne correctement (imprime toujours foo lorsque la touche est enfoncée). Ce que vous devez résoudre maintenant, c'est comment réinitialiser la minuterie.

Je ne sais pas quel type de minuterie vous utilisez. Mais je suppose que l'application a quelque chose à voir avec les événements de presse clés, et peut-être que vous utilisez le swing. Je vous recommande d'utiliser java.swing.Timer.

Il est très facile d'obtenir combien de temps s'est écoulé en utilisant une minuterie de swing.

final Timer t = new Timer (3000, new ActionListener() { 
    public void actionPerformed (ActionEvent e) { 
     System.out.println("bar"); 
    } 
}); 

Ceci est très simple. 3000 signifie 3000 millisecondes ou 3 secondes. Lorsque s secondes est écoulé, actionPerformed est exécuté. Dans actionPerformed, vous pouvez simplement appeler votre printBar (sans le chèque!) Ou vous pouvez appeler System.out.println pour répondre à l'exigence.

Alors maintenant, nous avons cette mise en place, comment allons-nous le réinitialiser?

Heureusement, la classe Timer fournit une méthode très utile, appelée restart. Dans votre méthode onPress, il suffit d'appeler cette méthode

@Override 
public void onPress() { 
    System.out.println("foo"); 
    t.restart(); 
} 

BOOM! Vous l'avez fait!

+0

Merci. Cela m'a beaucoup aidé et m'a orienté dans la bonne direction pour l'utiliser de plus de façons que prévu. – Danny2036