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 :

Traitement des ProgressDialog


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut Traitement des ProgressDialog
    Bonjour à tous,

    je suis actuellement en train de gérer les progressDialog sur mon application (eh oui j'arrive bientôt à la première version que je vais pouvoir mettre sur googlePlay).

    Pour gérer les progressDialog j'ai cette fonction:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    private void traitementDesDonnees(final int taille) {
     
    		progressDialog.setMessage("Chargement en cours");
     
    		progressDialog.show();
     
    		new Thread(new Runnable() {
     
    			public void run() {
     
    				for (int i = 0; i < taille; i++) {
     
    					try {
     
    						Thread.sleep(500);
     
    					} catch (InterruptedException e) {
     
    						e.printStackTrace();
     
    					}
     
    				}
     
    			progressDialog.dismiss();
     
    			}
     
    		}).start();
     
    	}
    Je passe en paramètre de la fonction un int ou viendra se loger la taille de mon jArray et en fonction de ça le chargement en dépendra. Cependant j'ai mis en dure le temps d'attente entre chaque tour de boucle (ici 500), mais il ne sera pas le même en fonction des utilisations de l'utilisateur. En effet, si il est en EDGE ou en WIFI le temps de chargement ne sera pas le même. Mon problème ici c'est par exemple que je suis en wifi, ça me marque toujours temps de chargement en cours mais je vois derrière les données qui ont déjà fini de chargé. Je ne sais pas trop comment gérer ça de manière plus optimisé, c'est à dire que si il est sur une grosse connection et que les données s'affiche presque immédiatement on voit peu le cercle de chargement et que si il est en EDGE et que c'est long que l'on voiut le cercle de chargement jusqu'à la fin du chargement des données.

    Je vous remercie

    Italia57

  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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Oula, oula

    Ne fais pas de démon (boucle "infinie") pour surveiller la progression. Pour faire une barre de progression, il faut que tu aies quelque chose de mesurable.

    Ici, c'est la taille du jArray que tu surveilles. Donc, lorsque celle-ci change, tu dois prévenir la dialog de se mettre à jour avec les nouvelles données. Bien sûr, faire attention à ne pas changer le thread graphique autre part que dans lui-même
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    ben comment je peux faire du coup pour que cela fonctionne le temps que ma listView se remplisse avec les données qui viennent de la BDD MySQL ?

  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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Comme je l'ai dit : tu cherches quelque chose de mesurable pour faire une progression. Si tu n'as rien qui correspond à ce critère, tu fais juste un chargement "indéfini". Une fois que tu auras identifié ça, tu pourras mettre ensuite identifier l'endroit où cette quantité change, et faire en sorte d'update la barre de progression.

    Je ne sais pas ce que tu fais, je ne sais pas comment tu le fais, je vois juste une boucle qui prend 500 ms par item.
    Je ne peux donc pas du tout donner plus d'info.

    Ps : intéresse-toi peut-être aux AsyncTask, ça devrait te faciliter un peu du travail.
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    qu'es qui pourrait être mesurable ? c'est ça que je ne comprend pas.

  6. #6
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Pour qu'une progress soit "définie" il faut:
    - Une taille "totale" (par exemple 218 rows)
    - L'avancement courant dans cette taille "totale" (par exemple row #16 / 218)

    L'utilisation des AsyncTask est tout indiquée puisque la classe propose de base la gestion des progress...


    Sinon, une solution est de passer de indéfini à défini......
    Exemple typique:
    Une requete à un webservice pour avoir une "liste de rows" de manière paginée..

    1. On ouvre la progress en mode "indéfini"
    2. On fait la première requete HTTP (en demandant la première page de 50 rows).
    3. On lit les résultats: Le total de rows est < 50 rows ? On passe directement au point #6
    4. On passe la progress en mode "défini" avec en progression: (page*50) / TOTAL
    5. On demande la page suivante (++page), on va en #3
    6. On dismiss la progress bar.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Citation Envoyé par Italia57
    qu'es qui pourrait être mesurable ? c'est ça que je ne comprend pas.
    Je n'en sais strictement rien, je ne connais pas ton code

    Je dis uniquement que, pour pouvoir faire une barre de progression, tu DOIS pouvoir mesurer cette progression.
    Une opération longue sans point de repère qui prend entre 2 et 10 minutes ne doit pas avoir de barre de progression, mais un loader indéfini.

    Une opération longue avec des points de repère qui prend entre 2 et 10 minutes peut avoir une barre de progression, puisque les points de repère permettent de mesurer l'avancée de l'opération.

    Nicroman te répond de manière moins abstraite que moi
    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 régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Je n'ai pas tous compris, moi ce que je cherche c'est pas qu'il me dise qu'il me reste tant de chose à chargé sur le total, mais que ça me marque chargement en cours tant qu'il y a des choses à chargé (ce que vous appelé probablement indéfini). Mais je ne sais pas comment m'y prendre.

  9. #9
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ah ben c'est plus simple dans ce cas-là ^^

    • affiche le progressDialog
    • lance l'opération
    • à sa fin, elle avertie qu'elle est finie
    • la tâche asynchrone prévient le progressDialog ou son responsable


    Où bloques-tu, concrètement ?

    Nicroman t'a donné un algo, je viens de t'en donner un autre. Je pense qu'il sera difficile de te répondre avec plus de détails sans avoir plus d'informations
    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

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Je dois donc simplement faire ça ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ProgressDialog maProgressDialog;
    maProgressDialog.setMessage("Chargement en cours");
    maProgressDialog.show();
    Donc le code ci-dessus là ou je souhaite qu'elle démarre et après pour l'arrêter ou je souhaite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maProgressDialog.dismiss();
    Je vous remercie

  11. #11
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Oui, c'est aussi simple que ça (sauf que là, dans ton snippet, tu as oublié d'initialiser la variable ^^')

    Pense bien à le faire dans le thread graphique, par contre.
    Si je peux me permettre aussi, pense à l'internationalisation (i18n), et utilise le mécanisme d'i18n d'Android pour les setMessage("Chargement en cours"), y penser maintenant t'épargnera du boulot si, plus tard, tu voudrais le faire
    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

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    tu parles de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maProgressDialog = null;
    Ok pour l'internationalisation et merci

  13. #13
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Euhf ... oui, là, ta variable est initialisée, mais quand tu tenteras de l'utiliser, tu auras une belle NullPointerException.

    Je pensais plutôt à quelque chose comme maProgressDialog = new ProgressDialog() en fait.
    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

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Ah oui, c'est parce que j'appelle pas forcément une initialisation dans mon vocabulaire quand on a recourt à NEW. Merci beaucoup.

    Sujet clos.

  15. #15
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Je me permets de poster derrière mon post plutôt que d'ouvrir un nouveau sujet, car j'ai encore des problèmes avec mes progressDialog.

    Voici mon code simplifié mais tout y est:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listeresto);
     
     
            progressDialog = new ProgressDialog(this);
     
            if (objetbunble != null && objetbunble.containsKey("BoutonLivraison"))
            {
     
    	            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    	            progressDialog.setMessage("Chargement en cours");
    	            progressDialog.show();
     
    	            try {
    	                HttpClient httpclient = new DefaultHttpClient();
    	                String url = "http://www.test.com/test.php";
    	                HttpPost httppost = new HttpPost(url);
    	                nameValuePairs.add(new BasicNameValuePair("codepostal", codePostal));
    	    		 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    	                HttpResponse response = httpclient.execute(httppost);
    	                json= new JSONObject(EntityUtils.toString(response.getEntity()));
     
    	                jArray1 = json.getJSONArray("requete1");
     
     
     
    	            } catch (Exception ex) {
    	                // signaler l'erreur
    	                Log.e("MyAppTag","Erreur réception données", ex);
    	                Toast.makeText(getBaseContext(),ex.getLocalizedMessage(),Toast.LENGTH_LONG).show();
    	                // ou throw new Exception(); si il faut signaler l'erreur à l'appelant !
    	            }
     
     
     
    	  	        if (jArray1.length() != 0)
    	  	        {
                                //Appel d'un adapter perso etc...
                                progressDialog.dismiss();
                             }
                             else 
                             {
                                 //Affiche une page 0 résultat
                                 progressDialog.dismiss();
                              }
               }
    }
    Je démarre donc la progressDialog une fois que l'utilisateur à cliquer sur le bouton, le code va chercher les données sur une BDD MySQL etc... et je la ferme à la fin.

    Le problème est qu'elle n'apparaît jamais...

    Je vous remercie

  16. #16
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Y'a pas un panneau "mauvaise pratique" ?

    Tu fais un appel réseau sur le thread principal : ton application plante sur HoneyComb+.

    TOUT appel réseau DOIT se faire un thread SÉPARÉ du thread graphique.

    Sinon, pour l'explication : tu lui demandes de se montrer (via show()), ensuite, tu fais ton traitement long qui freeze ton interface utilisateur (si c'est freeze, le fenêtre de progression ne peut pas se montrer ...) et ensuite, une fois le traitement fini, tu la vires.

    Donc, dans le thread graphique, c'est compris comme une suite de show/dismiss
    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

  17. #17
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Oups... Pourrais-tu m'aiguiller comment faire pour ne pas le faire dans le Thread Graphique ?

  18. #18
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Renseigne toi sur les AsyncTask, ça réponds totalement à ton besoin.
    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

  19. #19
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    J'avais fait un petit graph pour un pote.... si ca peut aider....

    En rouge le thread graphique dans lequel on ne fait aucun traitement long... En vert un "autre" thread...

    Flèche "pleine" call direct, Flèche non-pleine, call par message (changement de thread), Flèche en pointillé, retour de fonction.


    Images attachées Images attachées  
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  20. #20
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 345
    Points : 103
    Points
    103
    Par défaut
    Merci pour ce graphique il est très compréhensible. Je pense avoir bien saisi, cependant pour mette ça en place au niveau du code ça va être moins marrant me concernant. Cependant je vais essayer...

    EDIT: ce tutoriel Android est bien pour faire celà ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [VB.Net] Traitement des résultats d'une requète
    Par Catalan dans le forum ASP.NET
    Réponses: 23
    Dernier message: 05/10/2005, 17h29
  2. Traitement des dates différent suivant le serveur
    Par le lynx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/09/2005, 11h14
  3. Réponses: 1
    Dernier message: 24/07/2005, 22h25
  4. Traitement des champs memo par DBGrid
    Par Sydaze dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/04/2005, 09h24
  5. traitement des caractères spéciaux avec XSLT
    Par Mirgue dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 19/07/2004, 16h57

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