web-dev-qa-db-fra.com

Qu'est-ce que le Android UiThread (thread d'interface utilisateur)

Quelqu'un peut-il m'expliquer ce qu'est exactement le fil de l'interface utilisateur? Sur developer.Android.com, il est écrit à propos de la fonction runOnUiThread

public final void runOnUiThread (action pouvant être exécutée)

Depuis: API niveau 1 Exécute l'action spécifiée sur le thread d'interface utilisateur. Si le thread actuel est le thread d'interface utilisateur, l'action est exécutée immédiatement. Si le thread actuel n'est pas le thread d'interface utilisateur, l'action est publiée dans la file d'attente des événements du thread d'interface utilisateur.

Le fil d'interface utilisateur signifie-t-il qu'il sera exécuté chaque fois que l'activité est poussée dans l'arrière-plan par une activité d'interface utilisateur telle qu'un appel entrant ou une atténuation de l'écran, etc.? Si non, qu'est-ce que le fil d'interface utilisateur inclut exactement?

Merci

77
user434885

UIThread est le principal thread d'exécution de votre application. C'est ici que la plupart de votre code d'application est exécuté. Tous les composants de votre application (activités, services, fournisseurs de contenu, broadcastReceivers) sont créés dans ce fil et tous les appels système à ces composants sont effectués dans ce fil.

Par exemple, supposons que votre application soit une seule classe d'activité. Ensuite, toutes les méthodes de cycle de vie et la plupart de votre code de gestion d'événements sont exécutés dans cet UIThread. Ce sont des méthodes comme onCreate, onPause, onDestroy, onClick, etc. De plus, toutes les mises à jour de l'interface utilisateur sont effectuées. Tout ce qui provoque la mise à jour ou la modification de l'interface utilisateur a lieu sur le thread d'interface utilisateur.

Pour plus d'informations sur les processus et les threads de votre application, cliquez ici.

Lorsque vous créez explicitement un nouveau thread pour le faire en arrière-plan, ce code n'est pas exécuté sur le UIThread. Alors que se passe-t-il si ce thread d'arrière-plan doit faire quelque chose qui change l'interface utilisateur? C’est ce à quoi sert le runOnUiThread. En fait, vous êtes censé utiliser un gestionnaire (voir le lien ci-dessous pour plus d'informations à ce sujet). Il offre à ces threads d'arrière-plan la possibilité d'exécuter du code pouvant modifier l'interface utilisateur. Pour ce faire, ils placent le code modifiant l'interface utilisateur dans un objet Runnable et le transmettent à la méthode runOnUiThread.

Pour plus d'informations sur les threads de génération de travailleurs et la mise à jour de l'interface utilisateur, cliquez ici

Personnellement, je n’utilise que la méthode runOnUiThread dans mes tests d’instrumentation. Étant donné que le code de test ne s'exécute pas dans UIThread, vous devez utiliser cette méthode pour exécuter du code modifiant l'interface utilisateur. Je l’utilise donc pour injecter des événements de clic et de clé dans mon application. Je peux ensuite vérifier l'état de l'application pour m'assurer que les choses se sont bien passées.

Pour plus d'informations sur les tests et l'exécution de code sur le UIThread, cliquez ici

137
plainjimbo

Si vous exécutez du code de blocage (par exemple, une requête Http) dans un thread séparé, envisagez d'utiliser AsyncTask . Sa méthode doInBackground- s'exécute sur un thread séparé. AsyncTask vous fournit les méthodes onProgressUpdate et onPostExecute qui sont garanties sur le thread d'interface utilisateur .

Si vous avez besoin de mises à jour graphiques (par exemple, via une barre de progression), appelez publishProgress à l'intérieur de doInBackground. Cela conduit à un appel ultérieur de onPublishProgress qui est également garanti sur le thread d'interface utilisateur .

onPostExecute est automatiquement appelé après le retour de doInBackground.

9
Martin Pabst

Tous les dessins de l'interface utilisateur, etc., se produisent dans un fil séparé. C'est ce qu'on appelle l'UIThread. Si vous souhaitez apporter des modifications à l'interface utilisateur, vous devez vous assurer que cela se produit dans le contexte UIThread. Le moyen le plus simple de le faire est d'utiliser runOnUiThread

4
the100rabh