09.02.2017 Views

creez-des-applications-pour-android

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

5.1 Le travail en arrière-plan<br />

<br />

<br />

<br />

<br />

Ici, j’ai un receiver qui va s’enclencher dès que la batterie devient faible. Configuré de cette manière,<br />

mon receiver ne <strong>pour</strong>ra démarrer que si l’application est lancée (comme j’ai rajouté « : »,<br />

seule mon application <strong>pour</strong>ra le lancer) ; cependant, si l’utilisateur ferme l’application alors que<br />

le receiver est en route, le receiver ne s’éteindra pas puisqu’il se trouvera dans un autre processus<br />

que le restant <strong>des</strong> composants.<br />

Quand le système doit décider quel processus il doit tuer, <strong>pour</strong> libérer de la mémoire principalement,<br />

il mesure quelle est l’importance relative de chaque processus <strong>pour</strong> l’utilisateur. Par<br />

exemple, il sera plus enclin à fermer un processus qui ne contient aucune activité visible <strong>pour</strong><br />

l’utilisateur, alors que d’autres ont <strong>des</strong> composants qui fonctionnent encore — une activité visible<br />

ou un receiver qui gère un évènement. On dit qu’une activité visible a une plus grande priorité<br />

qu’une activité non visible.<br />

5.1.1.2 Threads<br />

Quand une activité est lancée, le système crée un thread principal dans lequel s’exécutera l’application.<br />

C’est ce thread qui est en charge d’écouter les évènements déclenchés par l’utilisateur<br />

quand il interagit avec l’interface graphique. C’est <strong>pour</strong>quoi le second nom du thread principal<br />

est thread UI (UI <strong>pour</strong> User Interface, « interface utilisateur » en français).<br />

Mais il est possible d’avoir plusieurs threads. Android utilise un pool de threads (comprendre une<br />

réserve de threads, pas une piscine de threads :p ) <strong>pour</strong> gérer le multitâche. Un pool de threads<br />

comprend un certain nombre n de threads afin d’exécuter un certain nombre m de tâches (n et m<br />

n’étant pas forcément identiques) qui se trouvent dans un autre pool en attendant qu’un thread<br />

s’occupe d’elles. Logiquement, un pool est organisé comme une file, ce qui signifie qu’on empile<br />

les éléments les uns sur les autres et que nous n’avons accès qu’au sommet de cet empilement.<br />

Les résultats de chaque thread sont aussi placés dans un pool de manière à pouvoir les récupérer<br />

dans un ordre cohérent. Dès qu’un thread complète sa tâche, il va demander la prochaine tâche<br />

qui se trouve dans le pool jusqu’à ce qu’il n’y ait plus de tâches.<br />

Avant de continuer, laissez-moi vous expliquer le fonctionnement interne de l’interface graphique.<br />

Dès que vous effectuez une modification sur une vue, que ce soit un widget ou un layout,<br />

cette modification ne se fait pas instantanément. À la place, un évènement est créé. Il génère un<br />

message, qui sera envoyé dans une pile de messages. L’objectif du thread UI est d’accéder à la pile<br />

<strong>des</strong> messages, de dépiler le premier message à traiter, de le traiter, puis de passer au suivant. De<br />

plus, ce thread s’occupe de toutes les métho<strong>des</strong> de callback du système, par exemple onCreate()<br />

ou onKeyDown(). Si le système est occupé à un travail intensif, il ne <strong>pour</strong>ra pas traiter les<br />

métho<strong>des</strong> de callback ou les interactions avec l’utilisateur. De ce fait, un ARN est déclenché <strong>pour</strong><br />

signaler à l’utilisateur qu’Android n’est pas d’accord avec ce comportement.<br />

De la sorte, il faut respecter deux règles dès qu’on manipule <strong>des</strong> threads :<br />

1. Ne jamais bloquer le thread UI.<br />

2. Ne pas manipuler les vues standards en dehors du thread UI.<br />

Enfin, on évite certaines opérations dans le thread UI, en particulier :<br />

329

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!