Rien de spécial
Le blog de Régis

IncidentsTransports-0.11

J’ai apporté quelques petites modifications à IncidentsTransports pour Android.

Crash de l’application quand l’orientation est changée

D’expérience, je sais que les utilisateurs sont sans pitié quand une application crashe. Et les bêta-testeurs m’ont justement remonté que ça arrivait sur mon appli, avec le message d’erreur « Exception: Application has leaked window here ».

Je n’ai pas mis longtemps à comprendre d’où vient le problème. Lorsque je raffraîchis la liste des incidents, je crée une fenêtre ProgressDialog que je ferme quand le serveur a répondu. C’est d’ailleurs ce que recommande de faire le guide de développement sur Using AsyncTask:

To update your UI, you should implement onPostExecute(), which delivers the result from doInBackground() and runs in the UI thread, so you can safely update your UI.

Mais ces conseils ne sont pas si bons 🙁 Comme toute boîte de dialogue, celle-ci est rattachée à une vue, celle de l’activité. La boîte de dialogue est créée dans onPreExecute() (« This step is normally used to setup the task, for instance by showing a progress bar in the user interface.) et fermée dans le onPostExecute(). Problème: si l’utilisateur modifie l’orientation de son écran, ou tout autre type de changement de configuration, l’activité est détruite (« This is done because any application resource, including layout files, can change based on any configuration value« ). Du coup, la fermeture du ProgressDialog se fait dans un contexte qui n’existe plus.

Le message de l’exception ainsi levée laisse sous-entendre qu’il y a un me memory leak. J’ai commencé à regarder le code source de la méthode dismiss() des Dialog dans d’Android (j’aime les projets open-source), mais je ne suis pas sûr de cette implication.

Pour le moment, j’ai changé la configuration de l’activité pour qu’elle ne soit pas détruite sur un changement de configuration de l’appareil, mais il est sans doute possible de faire mieux.

Messages d’erreur serveur plus détaillés

Quand le serveur ne répond pas HTTP OK, je me contentais d’afficher le code de statut, par exemple BAD REQUEST. Mais souvent, le serveur donne une explication plus détaillée dans le contenu de la réponse. Celle-ci est maintenant affichée.

Correction bug mineur: Icône sur l’incident ajouté par l’utilisateur

Quand l’utilisateur crée un incident, j’avais affecté la ligne mais oublié l’identifiant de ligne, nécessaire pour l’affichage du pictogramme.

Nouveau bug connnu: Impossible de voter pour l’incident créé

J’ai aussi découver #7 Impossible de confirmer/infirmer/indiquer terminé l’incident que l’on vient de créer.

Contournement: rafraîchir la liste des incidents, avant de tenter l’une de ces actions.