Les widgets, des amis qui vous veulent du mal (beaucoup)

Les widgets : Quand ça marche on ne touche plus ! Je viens de passer une journée à me battre avec un widget que j'avais déjà codé. Oui, oui déjà codé. C'était […]

Les widgets : Quand ça marche on ne touche plus !

Je viens de passer une journée à me battre avec un widget que j'avais déjà codé. Oui, oui déjà codé. C'était mon premier widget, il marchottait.  Je n'y avais pas touché depuis des semaines et je me suis dit qu'il méritait une petite refonte pour le recoller à un projet que j'avais retapé.

2 h de travail en théorie, 10 h en pratique. Un enfer. A un moment je me suis demandé si j'allait pas reprendre tout le projet de zéro tellement les effets de bords devenaient dramatiques.  A chaque lancement de l'appli une nouvelle erreur ésotérique apparaissait et stackoverflow ne pouvait rien pour moi.

Je viens de m'en sortir : cet article est mon analyse post traumatique.

Les widgets :

Ou comment Android vous accueille chez lui avec un fusil

La première chose à savoir avec les widgets c'est que c'est une vue que vous réserve Android sur SON bureau. Vous n'êtes pas chez vous, vous avez donc intérêt à vous tenir à carreau. Donc quand vous créez une classe du type :

public class Widget extends AppWidgetProvider{}

il faut savoir que grosso-modo vous ne pourrez rien faire avec directement.

Vous devrez passer par des services, tout le temps, partout, quoi que vous fassiez. Donc si vous ne voulez pas  de problèmes contentez vous de lancer des services et écouter des événements.

Les widgets : Des données à la durée de vie de l'ordre de la seconde

C'est une constatation empirique  :  Pour les widgets une donnée reste grosso modo accessible dans la méthode ou elle est initialisée. Selon mon expérience (mais n'hésitez pas à me corriger dans les commentaires) la durée de vie d'une variable est extrêmement courte.

Le garbage collector semble en furie : A peine vous les avez déclarées qu'elles semblent s'évanouir. En tout cas vous n'avez presque aucune main mise sur leur cycle de vie.

il faut donc stocker au minimum vos données de manière classique.

Les widgets : que chacun reste chez soi et les données seront bien gardées

Corollaire du point précédent : Dans le cadre d'une application avec une activité et un widget ne partagez aucunes données. C'est de là d'ou venaient mes erreurs ésotériques. Dès que le widget avait fini avec une donnée de mon activité le garbage colector s'empressait de la détruire et ce même si la donnée avait été crée via l'activité et était toujours utilisé. D’où les plantages à répétition alors que mon appli marchait comme un charme juste avant.

Les Widgets : Pour s'épargner quelques nuits blanches

On récapitule :

  • Considérez un Widget comme une vue. Ne la manipulez qu'avec des services
  • Attention aux données :
    • on ne les stocke pas de manière classique
    • on ne partage rien avec les activités
Bon courage cela en vaut la peine.

 

Social Share Toolbar
Pierre Benayoun

About Pierre Benayoun

A découvert Android "grâce" au premier et peut être pire téléphone sous cet OS: le HTC G1 en 2009. N'en a pas voulu a Google pour autant : il développe ses applications sur Android depuis cette date. Vous pouvez retrouver ses dernières actualités sur son blog : http://www.frandroid.com/blogs/vmvdd/