IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

[Conception] AsyncTask pour activité et widget


Sujet :

Android

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Points : 7
    Points
    7
    Par défaut [Conception] AsyncTask pour activité et widget
    Bonjour,

    J'essaye de développer en amateur autodidacte une application pour Android 4 (minSdkVersion="15").

    Le besoin simplifié est le suivant : appeler une URL pour récupérer un flux XML et afficher des données extraites.
    Pendant le téléchargement et le parsing, j'ai une ProgressBar pour faire patienter l'utilisateur.
    D'un point de vue restitution, j'ai actuellement une Activity simple dans mon application et je prévois un Widget.

    La partie AsyncTask (appel d'URL / parsing / extraction) ne me pose pas de problème.

    Actuellement, j'ai découpé mon Activity en 2 Fragments :
    • Un Fragment dédié à l'affichage, recréé lors d'une rotation
    • Un Fragment persistent (setRetainInstance(true)) qui contient l'AsyncTask et l'état de mes données

    Ça fonctionne très bien : le Fragment persistent "survit" à un changement d'orientation de l'écran et préserve l'état de mon AsyncTask et de mes données.

    Maintenant, j'aimerais ajouter un widget qui présente les mêmes informations. Sauf que je ne peux pas réutiliser mon Fragment persistent.

    Ma question arrive enfin : comment concevoir et découper tout ça ?
    Je pense à sortir l'AsyncTask dans un Service (que je peux appeler à partir de mon Fragment persistent et mon AppWidget). Est-ce la bonne piste ?
    Mais dans ce cas, comment prévenir mon Activity lors des progrès de mon AsyncTask ? Un listener fait main (mais j'ai peur de fuiter l'Activity) ? Ou via un Broadcast ?

    Et est-il possible que le widget se mette à jour si l'Activity rafraîchit ses données ? Via un Broadcast ?

    Je n'ai pas réussi à trouver d'exemple couvrant ce type de besoin. Si vous en avez un sous la main ça m'aiderait grandement.

    Merci d'avance,
    Neraud

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Salut !

    Que de bonnes questions !!

    Le traitement d'un widget est un cas vraiment particulier... sa demande de rafraîchissement et son dessin actuel sont dans deux process séparés....
    Voila en général comment je fais (il peut sans doute y avoir d'autres méthodes):

    1. Le traitement des données (récupération ici) est complètement découplé de toute interface... Par exemple:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public class MyTask extends ASyncTask<...>
    {
         public static interface MyTaskListener {
              public void onProgress(int cur, int max);
              public void onResult(...);
              public void onFailure(...);
         }
     
         MyTaskListener  listener;
     
         public MyTask(MyTaskListener  l) { this.listener = l; }
     
         public void onPostExecute() {
              if (failed)
                 this.listener.onFailure(...);
              else
                 this.listener.onResult(...)
         }
         ...
    }

    2. Une fois la tâche complètement découplée, on peut s'en servir coté UI dans un Fragment *et* dans un Service....
    Le widget va donc définir une service dont le seul rôle est de démarrer la tache, et d'implémenter MyTaskListener (à priori un par widget).
    Le listener se chargera d'aller vraiment mettre à jour le widget....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Effectivement, cette solution avec des listeners et 1 seule AsyncTask répond au besoin tout en factorisant le code.
    Merci pour cette réponse rapide.

    Tu aurais déjà mis en place un moyen de rafraîchir le widget si l'application sollicite l'AsyncTask ? Ce n'est pas du tout critique comme besoin, mais ça me parait intéressant de faire profiter les widgets de données plus fraîches si elles sont déjà disponibles.

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Raffraichir un widget c'est simplement un appel au WidgetManager avec un ID (le widget) et des RemoteView....
    Cela peut être fait depuis n'importe quel code.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 20
    Points : 7
    Points
    7
    Par défaut
    Ok, donc je prenais le problème à l'envers.

    Je n'ai pas besoin que chacun de mes widgets s'enregistrent pour être prêts à recevoir des mises à jour. Je peux pousser les données.

    Merci.

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Haaa ben oui !

    Le "Widget Holder" (bureau) va demander aux widgets de se raffraichir quand il en a besoin (création, etc...) en lui disant simplement "ho ! j'ai besoin que tu me dises ce que tu veux que je mette à ta position comme views"....
    Ensuite le code de widget va informer le manager: tiens voila les views qu'il faut mettre à cette position. Mais tout le monde peut le faire....

    D'ailleurs les demandes de refresh font souvent deux appels au update du manager:
    Un premier update avec les données en cache (et une marque de progression).
    Quand la tache longue est finie, un deuxieme update avec les données raffraichies (et mise en cache de ces données).
    Ca évite d'avoir un widget tout vide quand on démarre le téléphone (et qu'on n'a pas de réseau)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Conception] Idée pour la création d'un petit éditeur de texte
    Par ETI-trian dans le forum Général Java
    Réponses: 5
    Dernier message: 23/02/2006, 17h53
  2. [conception] Projet Suivi Activité
    Par aideaccess dans le forum Modélisation
    Réponses: 4
    Dernier message: 20/01/2006, 23h54
  3. [Conception][constructeur] pour faire un tableau
    Par vasilov dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 20/07/2005, 11h58
  4. [débutant][Conception] Modélisation pour éviter le getClass()
    Par Oliveuh dans le forum Général Java
    Réponses: 9
    Dernier message: 28/06/2004, 21h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo