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 :

Problème avec ProgressDialog


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Problème avec ProgressDialog
    Bonjour à toutes et à tous,

    Dans une application, au lancement, je charge plusieurs fichiers, ce qui met quelques secondes pendant lesquelles je voudrais afficher un ProgressDialog.

    J'ai écrit le code suivant et ... rien ne s'affiche.

    Si je supprime l'instruction "pd.dismiss", alors le ProgressDialog s'affiche ... mais après le chargement des fichiers !

    A priori, je n'ai rien compris du fonctionnement de ce composant.

    Pourriez-vous éclairer ma lanterne et me dire comment faire.

    Merci pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    ...
    		ProgressDialog pd = new ProgressDialog(this);
    		pd.setMessage("Initialisation");
    		pd.show();
    		initPgm(); // Chargement de fichiers
    		pd.dismiss();

  2. #2
    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
    Ta méthode "initPgm" doit être réalisée sur le thread graphique, et est un traitement long gelant l'interface.
    Ton Dialog apparaît bien, mais pendant le temps entre la fin des traitements de tes fichiers, et le temps de traiter la ligne le faisant disparaître, soit moins d'une seconde.
    Pour que ce que tu souhaites fonctionne, il faut que "initPgm" fasse un traitement en fond (AsyncTask, par exemple).
    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

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Hizin, je n'ai pas bien compris ce que tu voulais dire. Mais j'ai compris qu'il fallait que je crée un Thread pour y effectuer ma tâche longue. J'ai trouvé un bout de code sur le net qui fonctionne ... à condition que je modifie des séquencements internes à mon application.

    Code : 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
    	debut = true; // drapeau pour bloquer des tâches d'affichage qui commençaient à se dérouler avant que la tâche longue soit terminée.
    	final ProgressDialog progress = new ProgressDialog(this);
    	progress.setMessage("Initialisation");
    	progress.show();
    	new Thread(new Runnable() {
    		public void run()	{
     			FCH.initPgm(); // la tâche qui prend du temps
    			runOnUiThread(new Runnable() {
    				@Override
    				public void run() {
    					progress.dismiss();
    					debut = false; // baisser le drapeau pour que les tâches d'affichage puissent s'effectuer
    					monImg.invalidate(); // premier lancement des tâches d'affichage
    				}
    			});
    		}
    	}).start();
    Merci encore.

    Cordialement.

    Pierre

  4. #4
    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
    Tu as compris le principal, c'est le plus important ^^

    De base, tout traitement potentiellement long ne doit pas être effectué sur le thread graphique (ou main thread, ou event dispatching thread), bref, le thread responsable du rendu graphique. Cela peut facilement causer un gèle de l'interface, et sur Android, la crainte "Application not responding" (ANR).

    Là, ton problème était que tu demandais au thread graphique d'afficher ton dialog. Il prenait acte.
    Ensuite, tu faisais ton traitement long, qui l'accapare à 100%. A cause de ça, le thread graphique ne peut pas dessiner le Dialog à l'écran.
    Enfin, quand ton traitement long se termine,le thread graphique peut afficher le Dialog car il a de nouveau la main, et réalise l'instruction qui suit, à savoir la disparition du Dialog.

    La solution est de passer le traitement long dans un autre Thread ou processus. Une des implémentations possible était de passer par un Thread comme tu l'as fais.
    Une implémentation plus spécifique à Android est d'utiliser une AsyncTask qui est une classe "sucre syntaxique" très utile lorsqu'il y a peu de traitements parallèles.
    Elle possède des méthodes de préparation (onPreExecute) et finalisation (onPostExecute) qui se déroulent sur le thread graphique, ainsi qu'une méthode de traitement (doInBackground) qui se déroule en tâche de fond.
    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

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci Hizin, pour ces précisions.

    Je m'en vais aller voir ce que sont ces AsyncTask .

    Cordialement.

    Pierre

  6. #6
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Dans la documentation de AsyncTask et dans l'exemple qui y est donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
         ...
    Pouvez-vous m'expliquer à quoi correspondent les syntaxes suivantes :

    • AsyncTask<URL, Integer, Long> : signification des signes encadrant les types URL, Integer, Long.
    • Les trois points à la suite de (URL... urls)

    Y a-t-il un document où trouver cela ?

    Merci de votre aide.

    Pierre

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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