Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer l'activité principale

Mettre à jour l'UI via une AsyncTask

Sujet résolu
    13 novembre 2014 à 11:16:05

    Bonjour à tous,

    J'ai développé une application pour apprendre Android qui télécharge, via un lien URL http, une image et la stocke en base (Blob). Tout ça grâce a une classe qui hérite d'"AsyncTask".

    En gros, j'ai une activité principale qui affiche une listView de mes images en base. Dans cette activité, il y a un bouton qui démarre une deuxième activité qui correspond à un formulaire qui permet de rentrer l'url de l'image à télécharger.

    Mon souci étant de mettre à jour la listView de mon activité principale lorsque mon téléchargement est terminé (à savoir dans la méthode "onPostExecute" de mon AsyncTask). 

    Comment puis-je récupérer mon activité principale pour mettre à jour la liste qu'elle contient ?

    Merci d'avance de vos réponses.

    • Partager sur Facebook
    • Partager sur Twitter
    They hate us because they ain't us.
      13 novembre 2014 à 11:43:16

      Bonjour,

      Ce n'est pas la bonne manière de procéder. Il ne faut pas récupérer l'activité pour forcer sa mise à jour, mais s'aider des évènements Android pour éventuellement la mettre à jour.

      Par exemple, tu peux forcer une mise à jour dans la méthode onResume de ton Activité. Comme ça, dès que l'activité s'affiche à l'écran, elle sera mise à jour. L'inconvénient de cette méthode est quelle peut-être mise à jour alors que ce n'est pas nécessaire.

      La meilleure solution reste ce qu'on appelle les Broadcast. Tu peux dire à ton activité principale de t'abonner à une "action". Quand elle reçoit cette action, tu peux lui dire de faire des choses, comme par exemple se mettre à jour. Ainsi, dans ta deuxième activité, dès que le téléchargement est terminé, tu broadcast une action de rafrachissement, l'activité la "capte" et se rafraichit :)

      • Partager sur Facebook
      • Partager sur Twitter
        13 novembre 2014 à 15:51:28

        Merci beaucoup pour ta réponse !

        Je viens de creuser la piste du Broadcast, effectivement c'est efficace !

        Un problème persiste, je n'arrive pas à accéder à mon activité principale à partir de mon Broadcast... Comment puis-je faire ?

        Merci d'avance!

        • Partager sur Facebook
        • Partager sur Twitter
        They hate us because they ain't us.
          13 novembre 2014 à 17:06:39

          Il ne faut pas directement chercher à manipuler ton activité.

          Par exemple quand ton acitivité n°2 a terminé son traitement, tu envoies le broadcast suivant :

          sendBroadcast(new Intent("Refresh"));
          

          Dans ton activité principale, tu déclares un attribut de type BroadcastReceiveret un autre de type IntentFilter et tu instancies le tout dans le onCreate :

          intentFilter = new IntentFilter();
          intentFilter.addAction("Refresh");
          
          broadcastReceiver = new BroadcastReceiver()
          {
            @Override
            public void onReceive(final Context context, final Intent intent)
            {
                if ("Refresh".equals(intent.getAction()))
                {
                  //lancer le rafraîchissement de la page ici !
                }
            }
          };
          

          Il ne faut pas oublier de s'abonner à ce broadcast, par exemple dans la méthode onCreate toujours :

          registerReceiver(broadcastReceiver, intentFilter);
          

          Il faut également penser à s'y désabonner dans le onDestroy :

          unregisterReceiver(broadcastReceiver);
          
          • Partager sur Facebook
          • Partager sur Twitter
            14 novembre 2014 à 9:38:35

            OH MON DIEU !!

            Merci beaucoup ça fonctionne parfaitement bien !
            J'étais parti sur une classe à part entière qui héritait de BroadcastReceiver, j'avais pas pensé à l'implémenter directement dans mon activité principale !

            Merci beaucoup ça m'enlève une ÉNORME épine du pied !

            • Partager sur Facebook
            • Partager sur Twitter
            They hate us because they ain't us.

            Récupérer l'activité principale

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown