CountDownTimer: « Impossible de créer l'intérieur fil conducteur qui n'a pas appelé Looper.prepare () »
-
25-09-2019 - |
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!
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