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 :

Modification d'une vue dans l'UI ralenti mon application


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut Modification d'une vue dans l'UI ralenti mon application
    Bonsoir, j'ai un long traitement pour des edittexts dans un thread externe et l'UI avec la méthode View::post , mais le problème, c'est que l'application reste bloqué jusqu'à ce que le traitement soit terminé malgré qu'il est dans un autre thread.
    et si je fait tout le traitement dans le thread principal, sa vitesse est meilleur que celle de l'autre cas.
    voici le morceau de code correspondant:
    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
     
    	public void run() {
    		Point limit;
    		if(isH)
    			limit=	edit2.getLimitH(); //edit2 est une instantiation d'une classe héritant EditText
    		else
    			limit=	edit2.getLimitV();
    		for(int i=limit.x;i<=limit.y;i++){
    			final MyEditText edit;
    				edit = myList.get(new Point(edit2.getPosition().x, i));
     
    				// la partie sensible !
    				edit.post(new Runnable() {		
    					@Override
    					public void run() {
    						if(hasFocus)
    							edit.setBackgroundDrawable(bg1);
    						else
    							edit.setBackgroundDrawable(bg0);
    					}
    				}) ;
    		}	
    	}

  2. #2
    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
    A chaque étape de la boucle tu fais un "postRunnable"...
    Donc le runnable est executé (en parallèle du thread principal ou presque) .

    Le pire c'est qu'il est fort probable que les dernières instances du runnable tourne *après* que le thread soit terminé.

    D'autre part... si il y a, disons, 300 runnables empilés à un moment donné.. le click sur un bouton sera traité *après* ces runnables. Autant dire que l'application est bloquée.

    En général, on ne fait la mise à jour que X fois par seconde au maximum...

    Pourquoi ne pas utiliser un AsyncTask et la notion de "progress" ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    merci pour votre réponse, mais est ce que la modification de ces vue dans un AsyncTask ne bloque pas le thread principale?

  4. #4
    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
    je ne saisis pas la question....

    Une modification de View bloque toujours le thread principal (puisque c'est lui qui est chargé de cela).

    Prenons le cas de base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Thread Principal
    for (int i = 0; (i < 10000); ++i)
       view.setText("Iteration #"+Integer.toString(i));
    L'application est bloquée, et n'affichera rien puisque le message "refresh" sera posté par le setText, mais executé qu'à la sortie de la boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Thread 1
    for (int i = 0; (i < 10000); ++i)
       handler.postRunnable(new Runnable() { view.setText("Iteration #"+Integer.toString(i)); });
    L'application est bloquée de la même manière puisque le thread principal va "empiler" 10000 messages dans le thread principal indiquant de faire exactement la même chose... Résultat identique donc, avec en prime gestion du handler / thread / runnable (potentiellement problème de mémoire donc).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // AsyncTask
    class Task extends AsyncTask<Void,Integer,Void) {
        public void doInBackground(Void ... params)
        {
              for (int i = 0; (i < 10000) && !isCancelled(); ++i) 
                   publishProgress(Integer.valueOf(i));
        }
     
        public void onProgressUpdate(Integer ... i)
        {
              view.setText("Iteration #"+Integer.toString(i[0]));
        }
    }
    La c'est différent, l'AsyncTask va demander au thread UI de raffraichir la progression sur le premier publishProgress()... Tant que ce n'est pas fait, les publishProgress suivant ne feront rien.
    Quand l'UI a le temps (les autres évenements sont gérés), le thread principal va donc appeler onProgressUpdate()....

    En prime l'AsyncTask gère le cancel (pas facile à faire dans un "Thread" à la main), le handler, et le pool de threads....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    J'ai bien saisi, merci beaucoup pour la réponse détaillée

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    Mais est ce qu'il y a une bonne méthode pour modifier l’arrière plan des vues plus rapidement puisqu'elle change au moyenne chaque seconde?

  7. #7
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    puisqu'elle change au moyenne chaque seconde?
    D'où tu sors cette information ?
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 33
    Points : 29
    Points
    29
    Par défaut
    c'est mon programme qui doit le faire, parce qu'il s'agit d'un jeux.

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

Discussions similaires

  1. Modification d'une vue dans CRM V4
    Par Marie40200 dans le forum Microsoft Dynamics CRM
    Réponses: 1
    Dernier message: 24/03/2014, 11h30
  2. appeller une Vue dans un Select
    Par DR. dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/12/2004, 16h59
  3. Réponses: 7
    Dernier message: 12/07/2004, 22h30
  4. Oracle Designer: récupération d'une vue dans la base
    Par BILLYPATOU dans le forum Designer
    Réponses: 2
    Dernier message: 19/03/2004, 11h08
  5. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 11h57

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