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

On ne va pas utiliser directement AsyncTask, mais plutôt créer une classe qui en dérivera. Cependant,<br />

il ne s’agit pas d’un héritage évident puisqu’il faut préciser trois paramètres :<br />

— Le paramètre Params permet de définir le typage <strong>des</strong> objets sur lesquels on va faire une<br />

opération.<br />

— Le deuxième paramètre, Progress, indique le typage <strong>des</strong> objets qui indiqueront l’avancement<br />

de l’opération.<br />

— Enfin, Result est utilisé <strong>pour</strong> symboliser le résultat de l’opération.<br />

Ce qui donne dans le contexte :<br />

public class MaClasse extends AsyncTask<br />

Ensuite, <strong>pour</strong> lancer un objet de type MaClasse, il suffit d’utiliser <strong>des</strong>sus la méthode final<br />

AsyncTask execute (Params... params) sur laquelle il<br />

est possible de faire plusieurs remarques :<br />

— Son prototype est accompagné du mot-clé final, ce qui signifie que la méthode ne peut<br />

être redéfinie dans les classes dérivées d’AsyncTask.<br />

— Elle prend un paramètre de type Params... ce qui <strong>pour</strong>ra en troubler plus d’un, j’imagine.<br />

Déjà, Params est tout simplement le type que nous avons défini auparavant dans<br />

la déclaration de MaClasse. Ensuite, les trois points signifient qu’il s’agit d’arguments<br />

variables et que par conséquent on peut en mettre autant qu’on veut. Si on prend l’exemple<br />

de la méthode int somme(int... nombres), on peut l’appeler avec somme(1) ou<br />

somme(1,5,-2). Pour être précis, il s’agit en fait d’un tableau déguisé, vous pouvez donc<br />

considérer nombres comme un int[].<br />

Une fois cette méthode exécutée, notre classe va lancer quatre métho<strong>des</strong> de callback, dans cet<br />

ordre :<br />

— void onPreExecute() est lancée dès le début de l’exécution, avant même que le travail<br />

commence. On l’utilise donc <strong>pour</strong> initialiser les différents éléments qui doivent être initialisés.<br />

— Ensuite, on trouve Result doInBackground(Params... params), c’est dans cette méthode<br />

que doit être effectué le travail d’arrière-plan. À la fin, on renvoie le résultat de<br />

l’opération et ce résultat sera transmis à la méthode suivante — on utilise souvent un<br />

boolean <strong>pour</strong> signaler la réussite ou l’échec de l’opération. Si vous voulez publier une progression<br />

pendant l’exécution de cette méthode, vous pouvez le faire en appelant final<br />

void publishProgress(Progress... values) (la méthode de callback associée étant<br />

void onProgressUpdate(Progress... values)).<br />

— Enfin, void onPostExecute(Result result) permet de conclure l’utilisation de<br />

l’AsyncTask en fonction du résultat result passé en paramètre.<br />

De plus, il est possible d’annuler l’action d’un AsyncTask avec final boolean cancel(boolean<br />

mayInterruptIfRunning), où mayInterruptIfRunning vaut true si vous autorisez l’exécution<br />

à s’interrompre. Par la suite, une méthode de callback est appelée <strong>pour</strong> que vous puissez<br />

réagir à cet évènement : void onCancelled().<br />

Enfin, dernière chose à savoir, un AsyncTask n’est disponible que <strong>pour</strong> une unique utilisation,<br />

s’il s’arrête ou si l’utilisateur l’annule, alors il faut en recréer un nouveau.<br />

[[question]] | Et cette fois on fait comment <strong>pour</strong> gérer les changements de configuration ?<br />

339

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

Saved successfully!

Ooh no, something went wrong!