CountDownTimer: « Impossible de créer l'intérieur fil conducteur qui n'a pas appelé Looper.prepare () »

StackOverflow https://stackoverflow.com/questions/4006547

Question

Je sais que le problème général de « Impossible de créer gestionnaire intérieur thread qui n'a pas appelé Looper.prepare () » a été demandé, mais je me bats pour comprendre comment il applique dans ce cas.

Je suis en train de construire un nouveau CountDownTimer dans un thread non-UI, qui je pense est la cause de cette erreur, mais je ne comprends pas vraiment pourquoi la minuterie devrait être utilisé dans le thread principal. D'après ce que je peux voir, il ressemble a un gestionnaire de rappel qui doit exécuter dans un thread qui a un looper, que le fil non-UI ne pas par défaut. Il semble que mes options sont: 1) Faire de ce fil non-UI ont un Looper ou 2) faire une méthode étrange sur mon thread d'interface utilisateur qui peut construire cette horloge, les deux qui semblent loufoque me. Quelqu'un peut-il me aider à comprendre les implications?

En outre, personne ne sait de tous les liens utiles qui nous éclairent sur le Looper et MessageQueue? Je ne les saisissons pas bien, comme je suis sûr que je l'ai montré. Merci!

Était-ce utile?

La solution

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

Utiliser un AsyncTask et mettre à jour l'interface utilisateur dans onProgressUpdate

Autres conseils

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 qu'il est créé sur le thread d'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 a besoin d'une référence à votre activité et à une variable membre de classe mtimer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top