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 :

utilisation de handler thread


Sujet :

Android

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut utilisation de handler thread
    bonsoir .
    je veux savoire comment je peut faire fonctionner ce pseudo code:
    le problème "variable 'mTextViewCurrent' is accessed from within inner class needs to be final" sur tout les variable local de la fonction makeColor

    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
     
    final Handler myHandler = new Handler();
     
    				(new Thread(new Runnable() {
     
    					@Override
    					public void run() {
     
    					cordDonnes = verif.findIndexDonnes(mDonnes,clickTextView);
                                             makeColor(Color.parseColor("#4cc4ef"),cordDonnes);
    					}
    				})).start();
     
    			}
     
        public void makeColor(int Color,int tab[][]){
            MTextView mTextViewCurrent;
            for (int i=0;i<tab.length;i++){
                if(tab[i][0]<4 && tab[i][1]<4){
                    mTextViewCurrent=findMTextViewByCord(tab[i][0],tab[i][1]);
                    myHandler.post(new Runnable() {
     
    		     @Override
    			public void run() {
                                   mTextViewCurrent.setVisibility(View.VISIBLE);
                                    mTextViewCurrent.setBackgroundColor(Color);
    			}
    		});
                }
            }
     
        }
    et Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Quand on déclare une variable dans un scope local (d'une méthode), et qu'on l'utilise dans une classe anonymé créée dans ce scope, la variable doit être déclarée final : on utilise la variable dans une scope qui n'est pas celui où on la déclarée, donc elle est censée ne pas être à portée d'utilisation. Java permet qu'on l'utilise si on la rend final.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void uneMethode() {
        final Integer maVariable = 42;
        new Runnable() { // classe anonyme
             public void run() { // méthode de la classe anonyme qui normalement n'a accès que à ses variables locales (et ses paramètres si elle en avait)
                   System.out.println( maVariable ); // ici on peut quand même utilisé maVariable, alors qu'elle est déclarée dans une autre méthode, parce qu'elle y final, et que la classe anonyme est créée dans la méthode qui la déclare
             }
        }.run();
    }
    Dans ton cas :
    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
    public void makeColor(int Color,int tab[][]){
            MTextView mTextViewCurrent;
            for (int i=0;i<tab.length;i++){
                if(tab[i][0]<4 && tab[i][1]<4){
                    mTextViewCurrent=findMTextViewByCord(tab[i][0],tab[i][1]);
                    myHandler.post(new Runnable() {
     
    		     @Override
    			public void run() {
                                   mTextViewCurrent.setVisibility(View.VISIBLE);
                                    mTextViewCurrent.setBackgroundColor(Color);
    			}
    		});
                }
            }
     
        }
    C'est mTextViewCurrent que tu déclares dans makeColor() alors que tu l'utilises dans run() d'une classe anonyme (de type Runnable).

    Mais, une variable final ne peut se voir affecter une valeur qu'une seule fois (on est pas obligé de le faire au moment de la déclaration). La variable étant affectée dans la boucle, elle peut prendre potentiellement plusieurs valeurs. Même si dans les faits, le test if(tab[i][0]<4 && tab[i][1]<4){ était vrai qu'une seule fois, le compilateur ne peut pas le savoir, et ne permettra pas de rendre final la variable. Pour résoudre le problème, il suffit de déclarer la variable là où elle est affectée (c'est d'ailleurs une règle générale à suivre pour éviter plein de problèmes : déclarer une variable au plus près de son utilisation et en particulier son affectation).

    Donc, il suffit de faire :

    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
    public void makeColor(int Color,int tab[][]){
            for (int i=0;i<tab.length;i++){
                if(tab[i][0]<4 && tab[i][1]<4){
                    final MTextView mTextViewCurrent=findMTextViewByCord(tab[i][0],tab[i][1]);
                    myHandler.post(new Runnable() {
     
    		     @Override
    			public void run() {
                                   mTextViewCurrent.setVisibility(View.VISIBLE);
                                    mTextViewCurrent.setBackgroundColor(Color);
    			}
    		});
                }
            }
     
        }

    Il existe peut-ête d'autres problèmes, mais comme le code n'est pas complet, c'est difficile de le savoir. Il semblerait au moins que myHandler ne soit pas accessible depuis la méthode makeColor, puisque déclarée ailleurs (sauf si elle déclarée dans la classe qui a la méthode makeColor(). Il y a en tout cas beaucoup de variables utilisées dont on n'a pas ici les déclarations.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    Bonjour .
    merci pour votre réponse voila concernant cette problème ça marche.
    voila je réalise une jeu android sans utiliser les thread mais après un certain moment l'application sera planter .

    mais j'arrive pas a améliorer les performance (comportement inattendu) de mon application utilisant les thread.
    ce que je veux maintenant si vous avez un exemple un petit peu complexe utilise les thread

    et Merci.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Sur l'aspect Android, je ne peux pas t'aider. A part t'alerter sur le fait de faire attention avec ce que tu fais sur le thread graphique et le thread principal, et de prêter attention aux conflits éventuels que cela peut engendrer (Même si tu ne fais pas explicitement des threads dans ton application, tu en as forcément au moins 2 — probablement plus).

    Sinon difficile de faire un exemple, plus complexe ou pas sur les threads (ou assimilés), sans y passer des heures : il y a différents aspects à traiter, l'ordonnancement, l'accès synchronisé et les verrous, le partage de ressources, les famines, les deadlocks, etc. Et je n'ai pas d'exemples concrets et concis sous la main.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2014
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    Merci beaucoup pour vos réponses.

Discussions similaires

  1. Utilisation d'un thread pour faire une pause.
    Par ropabo dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 11/06/2006, 15h28
  2. utilisation du Multi threading
    Par chti_juanito dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 30/05/2006, 11h20
  3. [JProgressBar] Utilisation d'un thread
    Par GLDavid dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 16/01/2006, 12h17
  4. [C# 2.0][Form]Comment utiliser les Delegates & Threading
    Par Tips dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/01/2006, 15h22

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