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 :

Un écran noir fait disparaître le préload lorsque je teste la fin du téléchargement (du Thread).


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut Un écran noir fait disparaître le préload lorsque je teste la fin du téléchargement (du Thread).
    Bonjour à tout les développeurs android,
    y aurait-il des personnes de la communauté qui pourraient m'aider?
    Je développe actuellement une application Android et j'ai un petit problème d'affichage.
    Un écran noir fait disparaître le préload lorsque je teste la fin du téléchargement (du Thread).
    préload : affichage d'une petite roue qui tourne pendant le téléchargement pour faire patienter l'utilisateur.

    Ennoncé du problème :
    *******************
    Dans ma classe principale, j'instancie la classe_téléchargement puis j'appelle sa méthode Web_Service.
    La méthode Web_Service :
    - Appelle à la classe Thread qui télécharge les données et les insère dans un tableau.
    - Teste la fin du Thread
    - renvoie le tableau rempli.

    Plan du script
    **************

    classe principale
    -----------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Afficher le préload
    progressDialog.show();
     
    //instancie la classe_telechargement
    Datas = new classe_telechargement();
     
    //appelle sa méthode Web_Service (qui télécharge les données et les insère dans un tableau) et récupère le tableau.
    tableau = Datas.Web_Service();
     
    //Appel la méthode  "setListAdapter"  qui permet d'afficher le tableau.
    setListAdapter(new Remplissage_List());

    Méthode Web_Service dans la classe "classe_telechargement"
    ----------------------------------------------------------
    //méthode qui fait appel à la classe Thread (qui télécharge les données et les insère dans un tableau), test la fin du Thread et renvoie le tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public tableau[] Web_Service() {
     
    	//Appelle la classe Thread (qui télécharge les données, les insère dans un tableau)
    	thread = new Thread(new runGetDatas());
    	thread.start();
     
    	//la méthode join() de la classe Thread temporise le "return" jusqu'à ce que le thread se termine.
    	thread.join();
     
    	return tableau;
    }

    Le problème :
    -------------
    La méthode Web_Service renvoie le tableau pour être afficher dans la classe principale.
    Si je ne teste pas la fin du téléchargement dans la méthode Web_Service à l'aide de la fonction "thread.join()", cela provoque une erreur.
    L'erreur est logique puisque La méthode Web_Service renvoie le tableau pour être afficher dans la classe principale alors qu'il n'est pas encore rempli ou que le téléchargement n'est pas terminé.
    Donc, dans la méthode Web_Service, il est indispensable que je teste la fin du téléchargement (de la classe du Thread) qui permet de patienter le retour du tableau pendant qu'il se rempli.
    Le téléchargement et le remplissage du tableau se passe bien mais le problème est que lorsque je teste la fin du Thread, un écran noir apparaît, et donc, fait disparaître le préload.

    Je suis ouvert à toutes critiques.
    Merci à ceux qui veulent bien se pencher sur ce petit problème d'affichage.

  2. #2
    Membre éprouvé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Par défaut
    Bonsoir

    C'est une Activity ta classe principale?

    Si oui, il vaut mieux ne pas faire attendre le Thread principal (celui de ton activité) ça le vexe!!

    J'aime bien utiliser un Handler auquel je passe une reference de mon activité.
    Tu lances ton thread et juste avant de sortir de la méthode run() tu "send" un message à ton handler.. ainsi, ton activité est gentiment à l’écoute de l' événement "fin du thread" et non pas obligée de l'attendre...

    Dans ton Handler, lorsqu'il reçoit le message correspondant à la fin du thread, tu lances la suite des opérations (ton setListAdapter..)

    J'espère que ça t'aidera Si ça te parait trop obscur, j'essayerai de te mettre un ptit bout de code...

  3. #3
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Tout d'abord : les conventions Java.
    • pas de tiret bas dans les noms (sauf séparateur de constante et d'énumération)
    • UpperCamelCase pour les Classe (et assimilées) : commencent par une majuscule, mots collés, chaque nouveau mot commençant pas une majuscule (exemple : MaSuperClasseExemple),
    • lowerCamelCase pour les variables (et assimilées) : commencent par une minuscule, mots collés, chaque nouveau mot commençant pas une majuscule (exemple : monSuperExempleDeVariable).


    L'écran noir vient du fait que tu bloques l'UI avec Thread#join. L'application se lance, l'écran noir du thème standard apparaît et... bloque ensuite, join étant un appel bloquant.
    Tu dois mettre en place un système de notification de fin de traitement dan ton Thread, par exemple via un handler, comme CrikTeCroque te l'as suggéré. L'idée est que le thread de traitement prévienne le thread graphique de la fin du traitement.

    Etant sur Android, tu peux aussi t'intéresser à la classe AsyncTask, qui se charge de faire tourner les méthodes en background et sur thread graphique pour tout ce qui est loader, callback, progress, terminé...
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut Merci de vos réponses
    Bonjour CrikTeCroque et Hizin, merci de m'avoir répondu rapidement.
    J'ai lu avec attention vos commentaires et je vais étudier vos conseils avec attention aujourd'hui. Je vous tiens informé de l'évolution à mon problème.

    Pour répondre à la question de CrikTeCroque, étant donné que ma classe_principale est une ListActivity, sur vos conseils, je vais me pencher sur la classe AsyncTask. Je débute en programmation avec java sous android, donc, un petit bout de code serai le bien venu.

    En ce qui concerne Hizin, je te remercie de tes conseils de nommage avec java.
    J'espère à très bientôt pour d'autres conseilles. Didiou

  5. #5
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    public class AsyncTaskExample extends AsyncTask<TypeDesDonneesEnEntree, TypeDesDonneesDeProgression, TypeDesDonnesEnSortie> {
     
        private static final String TAG = "AsyncTaskExample";
     
        private Context           context;
     
        public AsyncTaskExample(Context ctx) {
            context = ctx;
        }
     
        // Cette méthode est automatiquement invoquée au tout début du traitement, avec le doInBackground et se déroule sur le thread graphique
        @Override
        protected void onPreExecute() {
            ...
        }
     
        // C'est ici que se déroule le traitement de la tâche. Cette méthode se déroule sur un thread AUTRE que le thread graphique, automatiquement géré par Android
        @Override
        protected TypeDesDonnesEnSortie doInBackground(TypeDesDonneesEnEntree... donnees) {
            TypeDesDonnesEnSortie result;
            ...
            publishProgress(progress); // optionnel, permet de publier le progrès de la tâche quand celui-ci set mesurable, le type de progress est TypeDesDonneesDeProgression
            ...
            return result;
        }
     
     
        // C'est ici que se déroule la notification du progrès de la tâche à l'utilisateur, si publishProgress(TypeDesDonneesDeProgression...) est utilisée. Cette méthode est invoquée sur le thread graphique.
        @Override
        protected void onProgressUpdate(TypeDesDonneesDeProgression... values) {
            ...
        }    
     
        // Cette méthode est automatiquement invoquée à la fin de doInBackground et se déroule sur le thread graphique
        @Override
        protected void onPostExecute(TypeDesDonnesEnSortie... result) {
            ...
        }
     
    }

    Et ça se lance via maTache.execute(mesDonneesEnEntree);.

    Voici l'exemple d'une AsyncTask. Il n'est absolument pas obligé de passer le context, il est tout à fait possible de créer l'élément de notification utilisateur et de la transmettre à la place (ou toute autre chose).

    Fais bien attention au caractère "..." dans le prototype des méthodes. C'est une ellipse, et TypeDesDonneesDeProgression... est équivalent à TypeDesDonneesDeProgression[]. C'est un tableau qui est reçu, mais pas forcément transmis.

    Exemple :
    maTache.execute(maDonnee);.
    maTache.execute(maPremiereDonnee, maSecondeDonnee, maTroisiemeDonnee);.

    Les deux sont valides, et coté traitement dans les méthodes de l'AsyncTask, il faut considérer un tableau

    Il y a aussi le onCancel à gérer, si la tâche est arrêtable, mais ce n'est pas trop compliqué à gérer.

    Au niveau des generics utilisé, si tu n'en utilises pas un, utilise simplement Void et ne traite pas les paramètres concernés.

    Je crois avoir fait le tour... avec un raccourci qui ne devrait normalement pas t'impacter.
    Attention par contre à la gestion des AsyncTask lors du cycle de vie de l'application (rotation, par exemple). De mémoire, ce tutoriel en parle bien : http://mathias-seguy.developpez.com/...nc_memleak/#L4
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  6. #6
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Il faudrait vraiment supprimer les fonctions "join()" et "sleep()" de la classe Thread... C'est tellement tentant de les utiliser.
    L'utilisation de ces fonction devrait immédiatement sonner dans la tête comme "j'ai fait une erreur de conception".

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

Discussions similaires

  1. Pc monté écran noir
    Par sandytarit dans le forum Périphériques
    Réponses: 8
    Dernier message: 30/07/2006, 23h52
  2. Réponses: 4
    Dernier message: 15/05/2006, 14h17
  3. Premier démarrage: écran noir
    Par chris21 dans le forum Périphériques
    Réponses: 2
    Dernier message: 22/02/2006, 08h30
  4. écran noir avec un shader d'éclairage au pixel près
    Par captainSeb dans le forum OpenGL
    Réponses: 2
    Dernier message: 16/05/2005, 12h30
  5. Visual C++ 6 : Problème impression d'écran noir
    Par charliejo dans le forum MFC
    Réponses: 6
    Dernier message: 24/01/2005, 09h52

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