Mise à jour d’une ListView depuis une AsyncTask
Le pas est fait! Je me met doucement au développement d’applications sous Android, et fort heureusement pour moi, tout se passe avec JAVA! En temps que novice en la matière, j’ai commencé (tout naturellement) par me documenter, et avant de partager ce tutoriel avec vous, je tiens à remercier http://www.tutomobile.fr/ pour ses nombreux exemples et explications qui m’ont permis de débuter sans trop me prendre la tête … tout y est! Je tiens à préciser qu’il s’agit là d’un simple retour d’expérience et qu’il existe peut-être une solution plus adaptée voire plus efficace. N’hésitez donc pas à me faire vos retours.
Une ListView va nous permettre d’ajouter des éléments en liste au moment de l’exécution de l’application, mais lorsqu’on ne connait ni le nombre ni le contenu de ces derniers, notamment lors de la récupération d’un flux RSS qu’on souhaite organiser en liste, le développement peut tenir du parcours du combattant (en moins épuisant … ouf!).
J’ai trouvé beaucoup d’exemples sur internet, mais personnellement, je ne voulais pas bloquer l’utilisateur avec une boîte de chargement, mon souhait était qu’il puisse utiliser la liste et son contenu, pendant que cette dernière continue à se remplir tranquillement.
La première étape consiste à définir nos layouts: main.xml et listentry.xml
- main.xml correspond au layout principal qui va définir l’organisation des éléments de notre application (ici juste une liste), et listentry.xml celui des éléments de la liste.
- Je ne vais pas expliquer l’organisation des fichiers XML, tout simplement parce que ce n’est pas l’objet de cet article, et surtout parce que d’autres sites le font déjà très bien (cf: le lien que j’ai donné en tout début d’article).
Ensuite, il ne nous reste plus qu’à lier le tout sous JAVA, instancier correctement nos objets et lancer la récupération de notre contenu de manière totalement asynchrone. Pour cela, nous allons utiliser AsyncTask, qui a pour principale fonction de lancer un processus en tâche de fond sans pour autant bloquer le thread principal qui gère l’application. En somme, si les traitements sont longs, l’application ne sera pas bloquée.
Voici le profil de la classe que j’utilise pour mes besoins qui hérite de AsyncTask.
private class CAsyncTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground (Void... unused);
protected void onPostExecute (final Void unused);
} // CAsyncTask ();
doInBackground parle d’elle-même, c’est ici que nous allons réaliser nos traitements susceptibles de prendre du temps.
onPostExecute sera automatiquement appelée lorsque la tâche aura terminée ses traitements.
Pour plus d’infos, je vous conseille d’aller jetter un petit coup d’oeil par ici : http://developer.android.com/reference/android/os/AsyncTask.html
Pour terminer il est important de noter qu’on ne peut pas modifier les éléments du thread principal sans en avoir l’autorisation, vous ne montez pas dans une voiture alors qu’elle roule à vive allure (… j’éspère), ici c’est un peu la même chose. Afin de pouvoir modifier la liste pour y ajouter des éléments, il va falloir faire appel à la méthode runOnUiThread de notre Activity qui attend en paramètre un objet de type Runnable.
activity.runOnUiThread (new Runnable () {
public void run () {
HashMap<String, String> map = new HashMap<String, String> ();
map.put ("title", it);
map.put ("description", "Pause de "+ sleep + " ms");
listItem.add (map);
adapter.notifyDataSetChanged ();
} // run ();
});
Et voilà! Notre liste se met gentillement à jour sans bloquer l’utilisation de l’application avec une boite de chargement.


