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

  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

  7. #7
    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
    <URL, Integer, Long> indique des generics (type paramétré en français).
    C'est la même chose que List<String>, la différence étant qu'une AsyncTask en compte trois : le type en entrée (URL), les type de la progression (Integer) et le type en sortie (Long) de par sa définition. La classe a été rendue générique grâce à ça.
    Un cours :
    - http://gfx.developpez.com/tutoriel/java/generics/
    - http://docs.oracle.com/javase/tutorial/java/generics/

    La syntaxe Type... type est peu utilisée. Elle se nomme varargs (ellipse en français), et indique "je prends en paramètre zéro ou plus argument de ce type".

    Je reprends le prototype : protected Long doInBackground(URL... urls)Cela signifie que je peux appeler cette méthode de plusieurs manières :
    • doInBackground(new Url("http://www.perdu.com"));
    • doInBackground(new Url("http://www.perdu.com"), new Url("http://www.perdu.com"), new Url("http://www.perdu.com"), new Url("http://www.perdu.com"), new Url("http://www.perdu.com"));
    • doInBackground();


    Du côté de doInBackground, urls est un tableau d'URL. Ainsi, le premier appel fournit un tableau d'un seul élément. Le second appel fournit un tableau de cinq éléments. Le dernier appel fournit un tableau vide.

    Une ellipse est utile dans tout les cas où une méthode prend un nombre de paramètre indéterminé du même type.
    Documentation : http://docs.oracle.com/javase/1.5.0/...e/varargs.html

    Ces deux fonctionnalités de Java ont été introduites par Java 5.
    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

  8. #8
    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 beaucoup Hizin pour ces explications et ces liens .

    Cordialement.

    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