2010-11-02 1 views
3

J'ai besoin de mon application pour déclencher une alerte pendant un certain temps après que l'utilisateur a appuyé sur un bouton. La documentation donne l'impression que Handler est ce dont j'ai besoin, et l'utilisation semble être mortel.Pourquoi le gestionnaire ne déclenche-t-il pas l'alerte comme prévu?

Cependant, je trouve que malgré l'utilisation de postDelayed, ma routine est en cours d'exécution. Je sais qu'il me manque quelque chose d'évident, mais je ne peux tout simplement pas le voir. Pourquoi le code ci-dessous fait-il vibrer le téléphone immédiatement plutôt que d'attendre une minute?

... 

    final Button button = (Button) findViewById(R.id.btnRun); 
    final Handler handler = new Handler(); 

    button.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) {    
     ... 
     handler.postDelayed(Vibrate(), 60000); 

     }   
    }); 
... 

    private Runnable Vibrate() { 
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
    v.vibrate(300); 
    return null; 
    } 

Répondre

3

C'est parce que vous le faites dans le mauvais sens. Il suffit de voir le flux:

handler.postDelayed(Vibrate(), 60000) appellera immédiatement la méthode Vibrate(), puis il exécute le truc vibreur. En fait Vibrate() renvoie null? Que pensez-vous que le gestionnaire fera avec une référence nulle? Vous avez de la chance qu'il ne lance pas un NullPointerException. Il y a trop d'exemples de comment implémenter correctement un gestionnaire ... il suffit de creuser un peu plus sur google.

private class Vibrate implements Runnable{ 
    public void run(){ 
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
    v.vibrate(300); 
    } 
} 

Puis:

handler.postDelayed(new Vibrate(), 60000); 
2

Vous devez écrire une méthode run() pour Vibrer:

private class Vibrate implements Runnable { 
    public void run(){ 
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
    v.vibrate(300); 
    //return null; don't return anything 
    } 
} 
+0

Je n'aime pas downvoting ... bien, vous feriez mieux de résoudre votre réponse. Dans ce cas, Vibrer() agit comme une méthode, pas comme une classe – Cristian

+1

Trié, merci pour le heads-up. – fredley

0

La façon la plus simple pour vous d'utiliser l'objet anonyme de Runnable,

... 

bouton Bouton final = (Bouton) findViewById (R.id. btnRun); final Handler handler = nouveau gestionnaire();

Vibrateur v = (Vibrateur) getSystemService (Context.VIBRATOR_SERVICE);

button.setOnClickListener (nouveau OnClickListener() {

 @Override 
     public void onClick(View v) { 

      handler.postDelayed(new Runnable() { 
       public void run() { 
        v.vibrate(300); 
       } 
      }, 60000); 
     } 
    }); 

...

Questions connexes