Android: Pourquoi ne puis-je pas créer un gestionnaire dans le nouveau thread
J'ai eu un problème de création d'un gestionnaire dans le nouveau thread. C'est mon code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
public void run() {
Handler handler = new Handler();
}
}).start();
}
Mais il a soulevé une erreur! Quelqu'un peut-il expliquer cela à moi? Merci beaucoup!
Voici les détails de mon erreur:
09-17 18:05:29.484: E/AndroidRuntime(810): FATAL EXCEPTION: Thread-75
09-17 18:05:29.484: E/AndroidRuntime(810): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-17 18:05:29.484: E/AndroidRuntime(810): at android.os.Handler.<init>(Handler.java:197)
09-17 18:05:29.484: E/AndroidRuntime(810): at android.os.Handler.<init>(Handler.java:111)
09-17 18:05:29.484: E/AndroidRuntime(810): at com.example.handler.MainActivity$1.run(MainActivity.java:57)
09-17 18:05:29.484: E/AndroidRuntime(810): at java.lang.Thread.run(Thread.java:856)
- Quelle est l'erreur que vous recevez?
- Vous êtes l'instanciation d'un
Handler
dans votre fil, mais vous n'êtes jamais à l'appel de méthodes sur elle. Vous assurer que ce que vous voulez? - Je veux écrire un peu de méthode dans le Gestionnaire, mais j'ai eu d'erreur lors de l'instanciation de la Gestionnaire, tellement simple que je viens de poster ici le code d'erreur. Quand j'ai couru ce code, l'application s'est écrasé
- au lieu de créer un Thread et le réglage de la fonction Looper pour que le Thread de lecture sur HandlerThread classe
- crash! post la trace de la pile
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également utiliser un
HandlerThread
comme ceci:HandlerThread
s ont unLooper
associés avec eux, de sorte à ne pas lever une exception.Le Thread
lifecycle
est fini juste après exécution de la méthode retourne. Mais puisque vous êtes en trainHandler
dans cethread
, le Gestionnaire a besoin de la thread pour être en cours d'exécution pour pouvoir recevoir des messages et de les traiter.Donc, pour ce faire, exécutez la méthode ne devrait pas quitter. Donc, vous avez besoin d'un Looper à attendre indéfiniment et traiter les messages qui arrivent au Gestionnaire.
Réponse courte: Parce que le fil que vous essayez de joindre le conducteur, qui n'a pas un looper. Et si le constructeur de la classe de Gestionnaire est en train de lancer une exception. Vous pourriez avoir utilisé un HandlerThread classe au lieu de cela, Ce est juste une pratique de classe fourni par l'Androïde cadre.
Veuillez lire ci-dessous de ce qui se passe sous le capot.
Permet d'abord d'essayer de discuter de toutes les pièces individuellement.
un. Un thread est juste un flux d'exécution. Un thread par défaut est supposé exécuter son exécutable(si fourni) ou d'appeler sa méthode run. Sur appel de nouveau Thread.start(). Un thread juste meurt et Gc avais quand la méthode run exécute toutes les déclaration écrite à l'intérieur de la course(){ ---- }.
b. Il existe un concept de Looper dans Android. Ce qui rend fondamentalement le fil d'un blocage du thread. Mettre simplement, il n'a tout simplement pas laisser le fil de mourir. Il va dans un état de blocage et d'attente pour les plus de messages pour de nouveau reprendre son exécution.
Ci-dessous comment vous pouvez configurer un blocage de fil je.e un thread avec un looper.
Ici un thread est créé, ce qui ne veut pas mourir juste après l'exécution de la fonction Looper.loop() instruction. Au lieu de cela il fait une boucle et passe dans un état de blocage. Maintenant vous devez vous demander quel est le sens de l'état de blocage, comment le thread va sortir de l'état de blocage ? comment puis-je enfin à sortir de ce fil maintenant ? C'est là que Gestionnaire vient dans
un. Il s'attache toujours à l'Arpenteuse de la fil, sur lequel une instance est créée.
b. Ensuite, il traite les messages du fil de discussion qu'il attache à l'.
Mettre ensemble thread et de gestionnaires.
un. Comment le gestionnaire obtient attaché à ce nouveau thread.
b. Le fil est configuré comme un blocage de boucleur. Ce n'est donc pas mourir.
maintenant, nous pouvons
1. Envoyez un message sur ce gestionnaire.
2. Post praticable sur ce gestionnaire.
Deux d'entre eux seront exécutés sur le fil.
Vous avez une option pour prolonger la classe de Gestionnaire et de mettre en œuvre la méthode handleMessage(Message msg). ou vous venez de fournir de la mise en œuvre de la Gestionnaire.Rappel dans le constructeur de la classe de gestionnaire. Dans les deux cas, le handleMessage(Messages msg) sera appelée sur le fil.
Pour quitter le fil, vous pouvez envoyer un type spécifique de type de message, et, après avoir reçu le message que vous voudrais simplement appeler la fonction Looper.myLooper().quit()
J'espère que cela a aidé à comprendre le concept global.
Un Gestionnaire doit être initialisé dans un Boucleur, ou ont un Looper donné.
En fonction de ce que vous voulez faire, vous pouvez configurer votre thread pour être un Looper comme suit:
Depuis le Looper est dans un thread d'arrière-plan, vous ne pouvez pas mettre à jour l'INTERFACE utilisateur. Vous pourriez alternativly donner le Gestionnaire d'un Looper à partir d'un autre thread - dans cet exemple, le Gestionnaire peut être utilisé pour mettre à jour l'INTERFACE utilisateur: