2 votes

AsyncTask Android avec Handler

Je travaille sur une application Android où je dois télécharger des images et lancer un diaporama. Pour télécharger les images, j'utilise une AsynTask, et dès que les images sont téléchargées, j'utilise un handler pour démarrer le diaporama. Mais lors d'un changement d'orientation, je ne suis pas en mesure de contrôler le handler. Parce que l'objet handler est défini avec la classe AsyncTask.

Voici le scénario approximatif de ce que j'ai fait :

La classe A prolonge l'activité

Classe B async = nouvelle Classe B(this) ;

async.execute() ;

La classe B étend AsyncTask et implémente OnPageChangeListener, OnTouchListener.

onPreExecute() -------Rien dans cette méthode

doInBackground -------Je télécharge les images ici

onPostExecute ---------Handler démarre ici et s'exécute toutes les 5 secondes pour la mise en œuvre du diaporama.

Maintenant, le problème :

Lors du changement d'orientation, j'ai fait en sorte que l'AsyncTask ne soit appelée qu'une seule fois, sinon elle télécharge à nouveau les images, c'est pourquoi le handler ne s'exécute pas lors du changement d'orientation.

Le premier objet handler qui a été démarré, continue à fonctionner mais les changements ne se reflètent pas à l'écran.

Je pensais mettre en œuvre une manière dont les images sont téléchargées en utilisant l'AsyncTask et une fois que le téléchargement est terminé, ClassA devrait gagner le focus et le handler devrait être mis en œuvre dans ClassA (seulement lorsque les images sont téléchargées).

0voto

Mohsin Naeem Points 7220

Le nom de la classe d'interface est adapté à mon cas. Veuillez l'adapter à vos besoins. ArtikelDetailsDataLoader ma tâche asynchrone. Ce qui indique à mon activité que les détails sont chargés.

dans votre classe B

public interface OndetailsLoadInterface {
    public void onDetailsLoad(ArtikelDetailsInfo artikelDetails);
}

OndetailsLoadInterface detailsLoaderInterface;

public void setOnDetailsLoadListener(OndetailsLoadInterface detailsLoader) {
    detailsLoaderInterface = detailsLoader;
}

et en onPostExecute

detailsLoaderInterface.onDetailsLoad(artikelDetails);

et dans la classe A

ArtikelDetailsDataLoader mLoader = new ArtikelDetailsDataLoader( items.get(position).getId(), mContext); mLoader.setOnDetailsLoadListener(mLoaderLisnter);

et

OndetailsLoadInterface mLoaderLisnter = new OndetailsLoadInterface() {

        @Override
        public void onDetailsLoad(ArtikelDetailsInfo artikelDetails) {
            //do slide show

        }

    };

0voto

Ovidiu Latcu Points 20783

Il suffit de créer une méthode dans votre Activity appelé startSlideShow(position) que vous appelez depuis votre onPostExecute() méthode, avec startSlideShow(0) .

Lors du changement d'orientation, sauvegardez la position actuelle du diaporama et les images téléchargées. onCreate(Bundle savedInstance) puis démarrer le diaporama à partir de la position précédente à l'aide de startSlideShow(restoredPosition); .

0voto

Jules Points 5015

Si votre problème est dû au redémarrage de l'activité lorsque l'orientation change, avez-vous envisagé de définir Android:configChanges="orientation" dans votre entrée AndroidManifest.xml pour l'activité, ce qui devrait empêcher les redémarrages ?

Ensuite, si vous devez effectuer des mises à jour de l'interface utilisateur (par exemple, passer à une présentation différente), vous pouvez gérer onConfigurationChanged(Configuration) et l'implémenter vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X