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 />

public void onClick(View v) {<br />

new Thread(new Runnable() {<br />

public void run() {<br />

int caractere = hamlet.indexOf("Être ou ne pas être");<br />

v.setText("Cette phrase se trouve au " + caractere + " ème caractère.");<br />

}<br />

}).start();<br />

}<br />

Le problème de notre exemple, c’est que l’opération coûteuse (la recherche d’un texte dans<br />

un livre) s’exécute dans un autre thread. C’est une bonne chose, c’est ce qu’on avait demandé,<br />

comme ça la recherche se fait sans bloquer le thread UI, mais on remarquera que la vue est<br />

aussi manipulée dans un autre thread, ce qui déroge à la seconde règle vue précédemment, qui<br />

précise que les vues doivent être manipulées dans le thread UI ! On risque de rencontrer <strong>des</strong><br />

comportements inattendus ou impossibles à prédire !<br />

Afin de remédier à ce problème, Android offre plusieurs manières d’accéder au thread UI depuis<br />

d’autres threads. Par exemple :<br />

— La méthode d’Activity void runOnUiThread(Runnable action) spécifie qu’une action<br />

doit s’exécuter dans le thread UI. Si le thread actuel est le thread UI, alors l’action est<br />

exécutée immédiatement. Sinon, l’action est ajoutée à la pile <strong>des</strong> évènements du thread<br />

UI.<br />

— Sur un View, on peut faire boolean post(Runnable action) <strong>pour</strong> ajouter le Runnable<br />

à la pile <strong>des</strong> messages du thread UI. Le boolean retourné vaut true s’il a été correctement<br />

placé dans la pile <strong>des</strong> messages.<br />

— De manière presque similaire, boolean postDelayed(Runnable action, long<br />

delayMillis) permet d’ajouter un Runnable à la pile <strong>des</strong> messages, mais uniquement<br />

après qu’une certaine durée delayMillis s’est écoulée.<br />

On peut par exemple voir :<br />

public void onClick(View v) {<br />

new Thread(new Runnable() {<br />

public void run() {<br />

int caractere = hamlet.indexOf("Être ou ne pas être");<br />

v.post(new Runnable() {<br />

public void run() {<br />

v.setText("Cette phrase se trouve au " + caractere + " ème caractère.");<br />

}<br />

});<br />

}<br />

}).start();<br />

}<br />

Ou :<br />

public void onClick(View v) {<br />

new Thread(new Runnable() {<br />

public void run() {<br />

int caractere = hamlet.indexOf("Être ou ne pas être");<br />

runOnUiThread(new Runnable() {<br />

331

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

Saved successfully!

Ooh no, something went wrong!