Les rappels se produisent-ils sur le thread principal (UI)?
Il y a beaucoup de Android SDK Api où les gestionnaires de rappel sont enregistrés. Pour un exemple concret, avec MediaPlayer vous pouvez définir une onCompletionListener de rappel. Ces rappels être appelée à partir de la principale (UI) thread? Si la réponse est "ça dépend", alors je suis à la recherche de quelques règles générales pour que les rappels seront appelés à partir du thread principal par rapport à un autre thread. La documentation du kit de développement ne semble pas à l'énoncer. (Peut-être que je l'ai raté.)
Il semble important de savoir, parce que si je suis garanti thread principal rappels, je ne peux ignorer certains synchronisation des threads sur des données partagées entre les différents lieux dans le code. Si je suis obligé d'être pessimiste de l'ignorance, alors je dois écrire supplémentaire de synchronisation de bloc de code et de se soucier de blocages, de l'intégrité des données, et une réduction des performances.
source d'informationauteur Erik Hermansen | 2010-10-12
Vous devez vous connecter pour publier un commentaire.
Un cas où Android va appeler votre code sur un autre thread si vous créez un service distant, exposée par AIDL -- ceux AIDL méthodes seront appelées sur un classeur thread, pas le thread principal de l'application.
Cependant, c'est l'exception. Comme les autres l'ont mentionné, la grande majorité de ceux-ci sont appelés sur le thread principal de l'application.
En cas de doute vous pouvez utiliser
Log.i("TAG", Thread.currentThread().getName());
et à voir 🙂Dans mon expérience, ces rappels de toujours revenir sur un non-thread d'INTERFACE utilisateur. Avez-vous essayé
Activity.runOnUiThread()
s'assurer que votre code s'exécute sur le thread de l'INTERFACE utilisateur? Vous avez encore l'impact sur les performances, car il faut plus de temps pour que ce code fonctionne, mais vous voulez éviter certains des problèmes les plus courants avec la synchronisation des threads.En général, les rappels se fera sur le thread où l'événement est en cours d'exécution. Si vous vous inscrivez à un rappel et de commencer quelque chose ne joue pas sur un thread d'INTERFACE utilisateur, puis le rappel se fera sur la non-thread d'INTERFACE utilisateur. Cependant, Android ne vais pas créer de nouvelles discussions en arrière-plan sur son propre.
Toute l'INTERFACE utilisateur liées à des événements doivent se produire sur le thread de l'INTERFACE utilisateur, de sorte que vous pouvez gauarentee cliquez sur gestionnaire des rappels, etc se feront sur le thread d'INTERFACE utilisateur.
Comme Aaron, C souligné, vous pouvez utiliser de l'Activité.runOnUiThread de forcer les choses s'y produisent.
En outre, la AsyncTask peuvent être très utiles pour faire de rapide de travail de fond, où vous avez besoin de l'achèvement de l'étape à gauranteed pour être sur le thread d'interface utilisateur.
edit: Exemple de commentaires.
Dans cet exemple, le onComplete "rappel" sera exécuté à partir de la non-thread d'INTERFACE utilisateur. Le fil de sortie après onComplete finitions.
Une autre exception est la Lorsque vous utilisez WebView. Lorsque le code javascript de l'appel d'une fonction Java, cette invocation ne se produira pas dans le thread principal
Quelque chose de similaire est venu lorsque j'ai travaillé sur l'Emplacement de l'Api. Comme nous le savons, nous fournissons une fonction de rappel pour les services de Localisation, de sorte que nous sommes avertis une fois que nous avons acquis un emplacement.
J'ai donc été faire quelque chose dans cette fonction de rappel qui prenaient un long moment, comme l'utilisation de Geocoder Api.
J'étais sous l'impression avant que, cette fonction de rappel devrait être appelé à d'autres thread et ne serait donc pas être exécutée sur le main thread d'INTERFACE utilisateur. Mais je peux le voir, ce n'est pas le cas.
Alors ce que jamais code que j'ai écris dans cet écouteur sera exécuté sur le thread principal.
Maintenant ce que je ne comprends pas, c'est comment parviennent-ils à le faire, est-il par l'utilisation d'un standard de la fonction
runOnUIThread()
???