2010-10-23 3 views
3

Je connais le problème général de "Impossible de créer un gestionnaire dans le thread qui n'a pas appelé Looper.prepare()" a été demandé avant, mais j'ai du mal à comprendre comment cela s'applique dans ce cas. J'essaie de construire un nouveau CountDownTimer dans un thread non-UI, ce qui, je pense, est la cause de cette erreur, mais je ne comprends pas vraiment pourquoi le timer devrait être utilisé dans le thread principal. De ce que je peux voir, il semble qu'il a un gestionnaire de rappel qui doit s'exécuter dans un thread qui a un looper, ce que le thread non-UI n'a pas par défaut. Il semble que mes options sont: 1) Faire ce thread non-UI avoir un Looper ou 2) faire une méthode étrange sur mon thread UI qui peut construire cette minuterie, les deux qui me semblent loufoque. Quelqu'un peut-il m'aider à comprendre les implications?CountDownTimer: "Impossible de créer un gestionnaire à l'intérieur du thread qui n'a pas appelé Looper.prepare()"

En outre, est-ce que quelqu'un connaît des liens utiles qui éclairent le Looper et MessageQueue? Je ne les saisis pas bien, comme je suis sûr que j'ai montré. Je vous remercie!

Répondre

3

La minuterie n'a pas besoin d'être dans un thread d'interface utilisateur. Mais je suppose que vous mettez à jour l'interface utilisateur pour afficher le compte à rebours dans ce thread. Yu ne peut pas faire ça.

Utilisez une AsyncTask et mettre à jour l'interface utilisateur dans onProgressUpdate

+0

Je ne crois pas que ce soit le cas. J'ai commenté tout le code à l'intérieur de la classe anonyme, donc tout ce qu'il appelle super dans le constructeur, mais je reçois toujours la même erreur. Est-ce parce que le CountDownTimer a une méthode de rappel pour quand il est fini, et cela doit être "tiré" par le looper? C'est la confusion que j'espère éclaircir. Nous pouvons même abstraire le problème de mon problème particulier - j'essaie simplement de comprendre comment tout cela s'accorde. Je vous remercie. – skaz

+0

Oh, je pense que j'ai mal compris votre question. Puis-je demander pourquoi vous utilisez un 'CountdownTimer' dans un thread nonUI? Je pense que le point de 'CountdownTimer' est de pouvoir facilement mettre à jour le thread UI. Il semble que 'onTick()' et 'onFinish()' sont supposés s'exécuter sur le thread de l'interface utilisateur. Pourquoi ne pas simplement utiliser une minuterie Java régulière? – Falmarri

+0

Je suppose que je peux utiliser une minuterie régulière. Quoi qu'il en soit, pourquoi CountDownTimer bombe dans le constructeur si je ne fais pas de mise à jour de l'interface utilisateur? – skaz

2

Une instance de CountDownTimer doit être créé sur le thread d'interface utilisateur.

Si vous aviez l'objet de classe personnalisée:

public class MyTimer extends CountDownTimer{ 
    public MyTimer(...){ 
     super(duration,interval); 
    } 
    //... other code ...// 
} 

La construction de l'objet doit être exécuté sur le thread d'interface utilisateur

MyTimer mTimer = new MyTimer(...); //can throw RuntimeException 
            // with Looper.prepare() issue if 
            // caller isn't UI thread 

Si plusieurs threads créent et détruire la minuterie, assurez-vous il est créé sur le fil de l'interface utilisateur en faisant quelque chose comme ceci:

MyActivity.runOnUiThread(new Runnable(){ 
    public void run(){ 
      mTimer = new MyTimer(...); 
    } 
}); 

mais remarquez comment le segment de code ci-dessus nécessite une référence à votre activité et à une variable membre de classe mTimer

Questions connexes