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 :

ProgressBar mise à jour depuis une autre classe


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut ProgressBar mise à jour depuis une autre classe
    Bonjour,
    Il existe pas mal de tutos sur les progressbar sur le web, mais j'ai remarqué que c'est à peu près tous les mêmes, et ils ne correspondent pas tout à fait à ce que je recherche.

    Je suis en train de développer une appli avec un splashscreen au démarrage, parce qu'au lancement de l'application je vais chercher des infos sur un serveur distant, des infos que je reçois en JSON, etc...

    Bref, pendant tout ce temps il me faut une progressbar qui avance sur mon splashscreen. Je souhaite que cette progressbar avance en fonction de ce qui à été traité dans ma classe qui s'occupe d'exploiter les données JSON. Donc je voudrais que cette classe, qui est executée en arrière plan, donne régulièrement un signal à l'activity en cours (le splashscreen) afin de faire avancer la progressbar.

    Je ne sais pas si j'ai été assez clair, je ne sais pas trop comment expliquer plus clairement...

    En tout cas si vous saisissez a peu près ce que je recherche, pouvez-vous me donner quelques pistes ?

    Merci

  2. #2
    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
    Cette tâche étant forcément en arrière plan (pour éviter les ANR), elle utilise un thread ou un AsyncTask.

    La deuxième solution est la plus simple puisque AsyncTask propose de base la gestion de la "progression" (il y a juste à appeler régulièrement une fonction, et surcharger le onProgressUpdate [ou du genre] pour aller modifier la progress bar).

    La première solution passe par l'utilisation de Handler (forcément utilisés pour notifier le thread UI de la fin du loading)... Et la, régulièrement, il faut 'poster' un runnable qui va mettre à jour la barre de progression.

  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
    Si la progression est inquantifiable (ou très difficile à quantifier ... telle action représente combien ? et si j'en ai X ? mais si 2 actions identiques représentes X mais s'exécutent en des temps très différents ? ...), plutôt utiliser un style de spinner, avec les informations de ce qui est en train de se passer au 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

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut
    Tiens, je ne connaissais pas AsyncTask...
    Il y a peut-être moyen de creuser la dessus en effet...
    Je vais y aregarder de plus près.

    Je comprends bien que ce genre de tâches sont en arrière plan, mais les tutos que j'ai vu sur le threads et progressbar utilisent qu'une seule "activity" a chaque fois... or moi, je souhaite utiliser mon activity (splashscreen) pour la progressbar, sachant que l'importation des données est réalisée dans un autre fichier "class", et ce que je n'arrive toujours pas, c'est de transmettre l'état de la progressbar d'un fichier à l'autre.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 256
    Par défaut
    Je viens de voir AsyncTask, ça correspondrait a ce que je recherche,
    mais ma classe qui execute la tache de fond contient plusieurs threads (je peux exécuter plusieurs taches de fond différentes), donc je ne peux pas tout mettre dans "doInBackground"...

    Donc la seule solution pour moi est la solution du Handler ?

    Dans ce cas, comment passer un runnable régulièrement pour actualiser la progressbar ? J'ai beau chercher, je ne comprends pas comment ça marche...

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 144
    Par défaut
    Citation Envoyé par poussinvert Voir le message
    Je viens de voir AsyncTask, ça correspondrait a ce que je recherche,
    mais ma classe qui execute la tache de fond contient plusieurs threads (je peux exécuter plusieurs taches de fond différentes), donc je ne peux pas tout mettre dans "doInBackground"...
    Rien ne t'empêche d'utiliser plusieurs AsyncTask.
    Ton activité (ou même une AsyncTask) peut très bien lancer d'autres AsynTask pour faire plusieurs traitement. Ne soit pas non plus trop gourmand car il y a une limite (5 en même temps).

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2010
    Messages : 26
    Par défaut
    Je ne sais pas du tout si cela peux t'aider
    mais j'avais codé ça en m'inspirant de plusieurs exemples et thread sur le forum.
    La classe mets à jour une progressBar dans une nouvelle fenêtre modale.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    public class SqlToCsv_SwingWorker 
    {
    	private static Logger _logError = Logger.getLogger( SqlToCsv_SwingWorker.class );
    	private final Launcher _launcher;
    	private final JLabel _info = new JLabel( "Progression .... " );
    	private JProgressBar _progressbar;
    	private int nbProd;
     
    	public SqlToCsv_SwingWorker( final Launcher launcher ) 
    	{
    		_logError.info( "Lancement export BDD to CSV" );
    		_launcher = launcher;
    		nbProd = getNbProduct();
    		_progressbar = new JProgressBar( 0, nbProd );
     
    		EventQueue.invokeLater(new Runnable() {
    			@Override public void run() {				
                    runCalc();
                }
            });
    	}
     
    	public void runCalc() 
    	{
    		final JDialog dlg = new JDialog( _launcher, "Progress Dialog", true );
    //	    JLabel dpb = new JLabel( "toto" );
    		dlg.add(BorderLayout.CENTER, _progressbar);
    	    dlg.add(BorderLayout.NORTH, _info);
    	    dlg.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    	    dlg.setSize(300, 75);
    	    dlg.setLocationRelativeTo(_launcher);
     
    		_progressbar.setIndeterminate( true );
            TwoWorker task = new TwoWorker( dlg );
            task.addPropertyChangeListener( new PropertyChangeListener() {
                @Override public void propertyChange(PropertyChangeEvent e) {
                    if( "progress".equals(e.getPropertyName()) ) {
                    	_progressbar.setIndeterminate( false );
                    	_progressbar.setValue( (Integer)e.getNewValue() );
                    }
                }
            });
     
            task.execute();
            dlg.setVisible( true );
        }
     
    	private class TwoWorker extends SwingWorker<Void, Integer>
    	{
    		private final JDialog _dial;
    		public TwoWorker( final JDialog dial ) {
    			super();
    			_dial = dial;
    		}
            @Override protected Void doInBackground() throws Exception {
            	InputSql inputSql = new InputSql( "" );
        		Product prod;    		
        		final SqlQuery sql = new SqlQuery();
        		try 
        		{
        			sql.connect();
        			ResultSet rs = sql.requete( "SELECT id FROM produit" );
        			try { 
    	    		    int currentRow=0;
    	    			while( rs.next() )
    	    			{
    	    				setProgress( (currentRow*100)/nbProd );
    	    				publish( currentRow );
    	    				String id_prod = rs.getString( 1 );				
    	    				inputSql.setIdProduit( id_prod );
    	    				prod = new Product();
    	    				prod = inputSql.getProductInformation();
    	    				String product_sirom = format( prod );
    	//    				save( product_sirom );
    	    		        currentRow++;
    	    			}	
        			}
        			finally {
        				rs.close();
        			}
        			sql.close();
        		} 
        		catch( SQLException e ) {
        			_logError.error( "Erreur sql lors de la récupération des informations" +
        					"necessaires pour l'export csv" + e );
        			JOptionPane.showConfirmDialog( null,
        					"ERREUR sql pendant l'export de la base de données\n" +
        					"Le fichier csv de sortie est incomplet.", "Confirm",
        			        JOptionPane.YES_OPTION, JOptionPane.ERROR_MESSAGE );
        			e.printStackTrace();
        		}	
        		finally {
        			_dial.setVisible( false );
        		}
        		return null; 
            }
            @Override protected void process(List<Integer> chunks) {
            	_info.setText( "Sauvegarde du produit " + chunks.get(chunks.size()-1) 
            			+ " sur " + nbProd );
            	_progressbar.setValue( chunks.get(chunks.size()-1) );
            }
    	}
    }

Discussions similaires

  1. Mettre à jour un TextView depuis une autre classe
    Par thesmogs dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 21/07/2013, 22h33
  2. Mise a jour d'une Form depuis une autre class
    Par raphi056 dans le forum C#
    Réponses: 1
    Dernier message: 19/12/2009, 13h44
  3. Réponses: 2
    Dernier message: 24/03/2009, 14h14
  4. [Débutant] Lancer procédure depuis une autre classe
    Par pugnator dans le forum Langage
    Réponses: 5
    Dernier message: 31/10/2005, 14h50
  5. Acces a un control depuis une autre classe
    Par schnito dans le forum MFC
    Réponses: 5
    Dernier message: 25/01/2004, 22h14

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