Android Activité.runOnUiThread n'est pas statique, alors comment puis-je l'utiliser?
Par exemple, si j'ai un fil de faire quelque chose de cher, et à partir de ce thread, je veux incendie runOnUiThread dans la Principale (activité) de la classe. Évidemment, je ne devrais pas en faire une instance de ma classe d'activité (Principale). Donc, si j'essaie
Main.runOnUiThread(mRunnable);
de mon fils, il me donne un message d'erreur indiquant que ce n'est pas une méthode statique, et à cet effet, il ne peut pas accéder à ma façon. Maintenant je peux comprendre que l'activité de la classe est presque presque accessible de manière statique.
Comment puis-je faire?
(Btw: je fais cela parce que je commençais à CalledFromWrongThreadException, Seul le thread qui a créé un point de vue de la hiérarchie peut toucher vues)
Main.this.runOnUiThread(mRunnable);
expression.
OriginalL'auteur usealbarazer | 2011-09-24
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser le Gestionnaire classe. La classe de gestionnaire s'exécute sur le thread de l'INTERFACE utilisateur. Lorsque vous avez fini de travailler dans votre fil, appel
handler.sendEmptyMessage()
, d'où vous pouvez effectuer les modifications de votre interface utilisateur.Handler
la documentation: Lorsque vous créez un nouveau Gestionnaire, il est lié à l'thread / message de la file d'attente du thread qui est de la création -- à partir de ce moment, il va livrer des messages et runnables pour que la file d'attente de messages et de les exécuter comme ils sortent de la file d'attente de messages. En d'autres termes, il ne fonctionne que sur le thread de l'INTERFACE utilisateur si l'objet a été créé.Voir stackoverflow.com/a/25250494/199364 pour savoir comment résoudre ce problème de manière c'est toujours sur le thread de l'INTERFACE utilisateur.
OriginalL'auteur Raunak
Votre question n'a pas vraiment de fournir suffisamment de détails, mais à partir du son des choses, vous êtes dans un privé intérieur de la classe (Runnable?) dans votre activité (Principale). Si c'est le cas, vous pouvez soit écrire:
ou
Aussi, vous voudrez peut-être chercher à AsyncTask, en particulier à l'
onPostExecute
,onPreExecute
etonProgressUpdate
rappels, qui fonctionnent sur le thread d'INTERFACE utilisateur.Que voulez-vous dire?
Pas plus de 6 peut être engendré en même temps. Donc, si vous avez une ListView avec des dizaines d'images à charger, par exemple, ça ne marchera pas.
J'ai appris aujourd'hui.
La limite de thread a changé dans Android 2.2, voir cette réponse.
OriginalL'auteur Jon Willis
Raunak a la bonne idée. Je vais juste ajouter que vous pouvez également spécifier un nombre entier dans la méthode sendEmptyMessage comme un identificateur pour le gestionnaire. Cela vous permettra de créer un gestionnaire peut gérer l'ensemble de vos mises à jour de l'INTERFACE utilisateur, par exemple
Espérons que cette aide!
OriginalL'auteur Ljdawson
d'abord créer un exécutable à l'extérieur onCreate. Comme ceci:
et puis l'appel de l'exécutable à l'aide de:
salut @IgorGanapolsky la réponse a été édité ...de bien vouloir revoir votre commentaire..merci 🙂
la réponse a été mis à jour, maintenant il fonctionne même en dehors de l'activité 🙂
OriginalL'auteur Nigel Crasto
toutes les réponses ci-dessus ne sont pas très correcte.
1)si vous voulez un morceau de code à exécuter sur le thread de l'INTERFACE utilisateur à partir de n'importe quel thread base de code. vous pouvez le faire:
Looper.getMainLooper().post(new Runnable(...))
parce que Looper.getMainLooper() est une variable statique et initialisé dans ActivityThread.
2) si votre exécutable extrait de code est à l'intérieur d'une activité
ensuite, vous pouvez utiliser:
MainActivity.c'.runOnUiThread(...)
OriginalL'auteur capcase
Pour ceux qui sont à la recherche pour une simple solution instantanée de suivre les étapes simples
Faire une référence de votre classe avant votre
onCreate()
méthodeL'initialiser dans vous
onCreate()
méthodeAppel
runOnUiThread()
Espère que cela aide.
OriginalL'auteur Syeda Zunairah