Quelle est la différence entre Activity.runOnUiThreadet View.post, quelqu'un pourrait-il, s'il vous plaît, expliquer?
Quelle est la différence entre Activity.runOnUiThreadet View.post, quelqu'un pourrait-il, s'il vous plaît, expliquer?
Réponses:
Il n'y a pas de réelle différence, sauf que le View.postest utile lorsque vous n'avez pas d'accès direct à l'activité.
Dans les deux cas, si ce n'est pas sur le fil d'interface utilisateur, Handler#post(Runnable)sera appelé en coulisses.
Comme CommonsWare l'a mentionné dans le commentaire, il y a une différence entre les deux - lorsqu'il est appelé sur le thread Ui, Activity#runOnUiThreadappellera la runméthode directement, tandis que View#postle postera runnabledans la file d'attente (par exemple, appelez le Handler#post)
Le point important de l'OMI est que les deux ont le même objectif, et pour quiconque l'utilise, il ne devrait y avoir aucune différence (et la mise en œuvre peut changer à l'avenir).
runOnUiThread()vérifie le thread actuel et exécute le Runnableimmédiatement si nous sommes sur le thread principal de l'application. post()met toujours le Runnabledans la file d'attente, quel que soit le thread auquel il est appelé.
runOnUiThread()vérifie le thread actuel et exécute le Runnableimmédiatement si nous sommes sur le thread principal de l'application " (emphase ajoutée). "Cela signifie-t-il que ce qui se trouve actuellement sur le thread de l'interface utilisateur est ignoré et que cela a la priorité?" - "ce qui est actuellement sur le fil de l'interface utilisateur" est l' runOnUiThread()appel.
Une autre différence entre Activity.runOnUiThread et view.post () est que l'exécutable dans view.post () est appelé après que la vue est attachée à une fenêtre.
Les deux sont acceptables dans la plupart des situations et pour la plupart, ils sont interchangeables, mais ils sont subtilement différents. La plus grande différence est bien sûr que l'un est disponible à partir d'un Activityet l'autre à partir d'un View. Il y a beaucoup de chevauchements entre ceux-ci, mais parfois dans un, Activityvous n'aurez pas accès à un View, et parfois dans un, Viewvous n'aurez pas accès à un Activity.
L'un des cas extrêmes que j'ai rencontrés avec View.postj'ai mentionné dans une réponse à une autre question SO surView.post : View.postne fonctionne qu'à partir d'un autre thread lorsque le Viewest attaché à une fenêtre. Ceci est rarement un problème, mais peut parfois empêcher l' Runnableexécution du, surtout si vous appelez View.postla onCreateméthode de votre Activity. Une alternative est d'utiliser Handler.postqui est quoi Activity.runOnUiThreadet d' View.postutiliser de toute façon sous les couvertures.
(modifié pour plus de précision, ajouté "à partir d'un autre fil")
onCreate()également? Hm, je m'attendrais à ce qu'il soit posté sur le Handlerfourni par ViewRootdans ce cas.
View.postdevrais ajouter le Runnableà une file d'attente pour être exécuté plus tard s'il n'est pas encore attaché. Je n'ai pas creusé beaucoup plus profondément dans la source, mais la documentation dit: "Cette méthode ne peut être invoquée de l'extérieur du thread de l'interface utilisateur que lorsque cette vue est attachée à une fenêtre." Donc, je pense que si c'est sur le fil actuel, alors ce que vous avez dit est vrai, si ce n'est pas le cas, il avale probablement juste le Runnable. Cela s'est certainement produit dans mon code.