Les Threads sous android

 

Les threads

Les threads sous Android fonctionnent exactement sur le même principe que ceux de JAVA. Donc je ne reviendrais pas dessus.

 

L'UI Thread

Il existe un thread nommé UI thread (UI pour User Interface) qui est le thread principal de l'activité courante de votre interface.

Vous noterez cependant l'étrangeté de ce thread: Généralement, un thread a une durée de vie très limitée. En fait, il doit s'arrêter dès qu'il a fini d'exécuter sa dernière instruction. Or ce n'est pas le cas de celui-ci.

Ici, il s'agit d'un looper thread. Dès qu'il a fini, il se met automatiquement en attente de l'exécution de nouvelles instructions.

Il s'agit de mettre en place un Looper (boucle évènementielle ou boucle de messages). Cette classe Looper va permettre de gérer ces évènements que le thread pourra ensuite traiter (Le looper est implémenté sous la forme d'un design pattern TLS pour Thread Local Storage).

Image non trouvée !Par contre, il est important de noter qu'un thread ne doit pas agir directement sur votre interface ! Ce rôle doit rester au seul UI Thread ! Sinon, vous recevrez un beau message dans la console: "ERROR/AndroidRuntime(315): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."

 

ANR où le problème des traitements longs

Application Not Responding:

Des traitements, un peu long à l'exécution (chargement de fichiers, éventuellement via internet, calculs longs,...), ne pourront pas être lancés dans le UI thread, car l’ActivityManager contrôle le temps de réponse de ces UI threads (délai d'attente de moins de 5 secondes). Si l'UI Thread est beaucoup trop long à répondre, l’ActivityManager proposera à l'utilisateur de le tuer !

D'où parfois ce genre de message qui s'affiche indiquant que "l'activité en cours ne répond pas, voulez-vous attendre pour voir s'il se termine, ou l'arrêter ? ".

C'est donc là l'intérêt des threads que vous allez pouvoir lancer. Cependant, il se pose donc un problème: Seul le UI Thread peut gérer les interfaces, et il préférable de passer par d'autres threads pour effectuer des traitements lourds. Or, généralement, un traitement lancé doit afficher un résultat à l'interface. Les threads non UI doivent donc pouvoir communiquer avec le UI thread, par exemple pour indiquer la fin d'un traitement lourd afin que l'UI Thread informe à son tour l'utilisateur.

Or l'UI Thread a un looper. Donc qu'il peut traiter des messages. Cette communication inter-thread pourra ce faire à l'aide de la classe Handler qui sera capable d'envoyer des messages à votre UI Thread.

Vous verrez aussi comment transformer un thread standard en looper thread...

 

La classe Handler

- Les messages
- Lecture d'un message
- Envoyer des messages
- Exemple de code avec des messages
- Handler avec Runnable
- Poster des objets implémentant Runnable
- Exemple de code avec des objets Runnable

La classe Looper

- Explication
- Exemple

AsyncTask

- Les méthodes
- Points importants sur les méthodes de AsyncTask
- Création de votre classe de tâches asynchrones
- Les types de paramètres des méthodes
- Où créer, instancier votre classe AsyncTask
- Exécuter votre tâche en arrière plan
- Interrompre l'exécution d'une tâche
- Etat de la tâche en arrière plan
- Exemple de code

 

Image non trouvée ! Il existe une méthode dans la classe Activty qui permet de forcer le lancement d'un traitement Runnable dans l'UI Thread, et ceci même si vous êtes dans un tout autre thread: runOnUiThread(). Elle fonctionne exactement sur le principe du post de handler si vous utilisez cette méthode hors UI Thread. Si vous êtes déjà dans l'UI Thread, alors il y a exécution immédiate de l'objet Runnable.