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

Composants graphiques Android Discussion :

Problème d'affichage d'un textview qui se trouve dans un fragment


Sujet :

Composants graphiques Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2013
    Messages : 39
    Points : 14
    Points
    14
    Par défaut Problème d'affichage d'un textview qui se trouve dans un fragment
    Bonjour,

    Mon problème:
    Mon activité comporte 6 fragments qui comportent plusieurs textview.
    A partir de mon activité j'aimerai pouvoir afficher des informations dans chacun de ces textview.
    le problème est que dès que j'envoie une donnée à afficher mon application arrête de fonctionner.

    Mon application arrête de fonctionner lorsque je met les lignes de code suivantes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Déclaration se trouvant au début de ma class
    TextView textview1;
     
    //Code se trouvant dans un switch qui vient afficher les données en fonction du fragment visible.
    textview1 =(TextView)findViewById(R.id.affichage1);
    textview1.setText(String.valueOf(1)); // --> Mon application fonctionne si je met cette ligne en commentaire
    Je pense que mon problème est lié à mon activité qui doit venir afficher dans un textview, qui se trouve dans un fragment. (Relation activité --> fragment)

    A mon avis ,cette ligne de code ci-dessous doit être modifiée mais je ne sais pas comment le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    textview1 =(TextView)findViewById(R.id.affichage1);
    Merci à tous ceux qui pourront m’aider.



    Autre:
    Où puis - je trouver les règles à respecter en programmation
    --> Majuscule au début des méthodes etc...

  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
    Pour les "conventions" java c'est là:
    http://www.oracle.com/technetwork/ja...oc-136057.html

    Et c'est justement l'inverse .... ^^

    Majuscule au début reservé aux:
    * Constantes (en fait toute la constante est en majuscules)
    * Nom de types (Camel Case)

    '_' interdit

    Membres, Variables locales & Paramètres: Camel case... minuscule au début
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre éclairé
    Avatar de maxusn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 174
    Points : 661
    Points
    661
    Par défaut
    Salut,

    essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    textview1 = (TextView) getView().findViewById(R.id.affichage1);
    si ça ne fonctionne pas, peux tu mettre les logs qui te sont renvoyés

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2013
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    J'ai essayé getView() sans succès.

    voici mon code

    Un thread qui tourne en tache de fond
    envoi une information a un handler
    qui vient lancer une méthode qui affiche dans mes différents fragments

    n’hésitai pas à me dire si cette façon de procéder est bonne ou si il faut que je la modifie.

    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
     
    public void treadRun(final View v)
    	{
     
    		new Thread(new Runnable() 
    		{
    		    public void run() 
    		    {
    		    	while(1<2)
    		    	{			    	
    		        		remplissageDonnees();
    		        		m=1;
    		        		handler.sendMessage(handler.obtainMessage(m));
    			    		//Log.i("FragmentsSliderActivity.class","Methode Run lance pour calcul "+new Date().toString());
    			    		try 
    			    		{
    							Thread.sleep(500);
    						} 
    			    		catch (InterruptedException e) 
    						{
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    			    }
    		    }
    		  }).start();
    	}
     
    	Handler handler = new Handler() 
    	 {
     
    	        @Override
    	        public void handleMessage(Message msg)
    	        {
    	        	//Log.i("FragmentsSliderActivity.class","Methode Handler");
    	            if(m==1)
    	            {
    	            	affichageDonnes();
    	            }
     
    	        }
    	 };
     
    	 public void affichageDonnes()
    	 {
    		 	posFragment = pager.getCurrentItem();
    		 	test=(ProgressBar)findViewById(R.id.chargeBatteriePermanent);
     			Val=(int)(Math.random() * (100-0)) + 0;
     			test.setProgress(Val);
     			Log.i("FragmentsSliderActivity.class","Valeur de la page1 => "+posFragment);
     			switch(posFragment)
     			{
    	 			case 0:
    	 				Log.i("FragmentsSliderActivity.class","Valeur de la page1 ===> "+posFragment);
    		         	tempBatterie1=(TextView)findViewById(R.id.tempBatterie);
    		         	//tempBatterie1.setText(String.valueOf(1)); //---> le programme s'arrête si je met cette ligne
    		         	//progressBarChargeBatterie1=(ProgressBar)findViewById(R.id.progressBarChargeBatterie);
    		 			//progressBarChargeBatterie1.setProgress((int)(Math.random() * (100-0)) + 0);
    		         	break;
     
    	 			case 1:
    	 				break;
     
    	 			case 2:
    	 				break;
     
    	 			case 3:
    	 				break;
     
    	 			case 4:
    	 				break;
     
    	 			case 5:
    	 				break;
     			}
    	 }
    voici le logcat

    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
     
    02-27 16:43:09.477: I/MyPagerAdapter.class(1958): Fragment -_-
    02-27 16:43:09.497: I/dalvikvm(1958): threadid=3: reacting to signal 3
    02-27 16:43:09.517: I/dalvikvm(1958): Wrote stack traces to '/data/anr/traces.txt'
    02-27 16:43:09.607: I/FragmentsSliderActivity.class(1958): Valeur de la page1 => 0
    02-27 16:43:09.607: I/FragmentsSliderActivity.class(1958): Valeur de la page1 ===> 0
    02-27 16:43:09.617: D/AndroidRuntime(1958): Shutting down VM
    02-27 16:43:09.617: W/dalvikvm(1958): threadid=1: thread exiting with uncaught exception (group=0xb616d180)
    02-27 16:43:09.617: E/AndroidRuntime(1958): FATAL EXCEPTION: main
    02-27 16:43:09.617: E/AndroidRuntime(1958): java.lang.NullPointerException
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at com.tutos.FragmentsSliderActivity.affichageDonnes(FragmentsSliderActivity.java:158)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at com.tutos.FragmentsSliderActivity$1.handleMessage(FragmentsSliderActivity.java:140)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at android.os.Looper.loop(Looper.java:137)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at java.lang.reflect.Method.invokeNative(Native Method)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at java.lang.reflect.Method.invoke(Method.java:511)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    02-27 16:43:09.617: E/AndroidRuntime(1958): 	at dalvik.system.NativeStart.main(Native Method)
    02-27 16:43:10.257: I/dalvikvm(1958): threadid=3: reacting to signal 3
    02-27 16:43:10.268: I/dalvikvm(1958): Wrote stack traces to '/data/anr/traces.txt'
    02-27 16:43:10.457: I/dalvikvm(1958): threadid=3: reacting to signal 3
    02-27 16:43:10.467: I/dalvikvm(1958): Wrote stack traces to '/data/anr/traces.txt'
    je remarque qu'il rentre bien dans mon switch donc le problème vient après.
    j'ai testé plusieurs fois mon code en passant les lignes de code en commentaire au fur et à mesure et la ligne qui fait planter mon application
    c'est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //tempBatterie1.setText(String.valueOf(1));
    mais je pense que c'est la ligne qui vient juste avant celle là qui fait réellement planter l'appli
    soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tempBatterie1=(TextView)findViewById(R.id.tempBatterie);

  5. #5
    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
    Moi je pense surtout que tu as un problème de conception...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    02-27 16:43:09.617: W/dalvikvm(1958): threadid=1: thread exiting with uncaught exception (group=0xb616d180)
    Que veux tu faire exactement ? La le code appelle remplissageDonnees(); dans un thread non-UI toutes les 500ms.... et affichageDonnées() dans le thread-UI après (ou avant on ne sait pas trop). Le thread tourne indéfiniment avec un "sleep()" donc il y a eu erreur de conception.

    Bref je ne comprends pas le truc....
    Normalement la logique c'est:

    EVENEMENT-1 =>
    Démarrer un thread pour le remplissage-données... à la fin duquel on signale EVENEMENT-2

    EVENEMENT-2 =>
    En restant dans le thread-UI: affichage des données... à la fin... on *schedule* EVENEMENT-1 pour dans 500ms

    onResume() =>
    On lance EVENEMENT-1

    onStop() =>
    On vire tous les EVENEMENT-1 en attente
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2013
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Merci necroman pour ta réponse
    Mais je suis un débutant en programmation androïd et java et je ne maitrise pas encore les thread.

    Donc si tu pouvais préciser comment appliquer ton idée cela m'aiderai beaucoup

    si je comprend ce que tu dis je devrai:

    Crée un thread qui exécute la méthode remplissageDonnées()
    et lorsque cela est fait je devrai venir afficher mes données en passant par un autre thread qui est réservé a l'affichage.
    Puis lorsqu'on visualise le fragment qui affichent les données, on vient
    rafraichir les données afficher et arrêter le rafraichissement des données lorsqu'on quitte le fragment ( pour passer a un autre fragment par exemple).

    Problème:

    Comment fait - on le signal ? j'utilise un Handler?

    Le thread ui, je vois souvent cela dans les différents tuto
    mais je ne sait pas comment l'utiliser et a quoi il correspond réellement à part qu'il est réservé a l'affichage de données.
    J'ai vu quelque exemple de thread ui sur plusieurs forum mais il me paraisse compliquer et pas "top".

    Pour le sleep(500); je sais qu'il faut éviter cela a tout pris car il bloque l'appli mais je vois pas comment le réaliser autrement.


    Merci d'avance.

  7. #7
    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
    Bon... Le "Thread-UI" est l'autre nom donné au thread "principal" (celui du "main" qui a démarré l'application).
    Ce thread est utilisé par toute l'UI, d'ou le nom "thread-ui".
    Quand on est dans une fonction "onXXXXX" de l'activité, on est dans ce thread là.

    Quand tu crées un "handler", le handler va gérer une liste de message, si poser un message dans un handler peut se faire n'importe ou, l'utilisation du message (l'appel à handleMessage) se fait dans le thread qui a créé le handler...
    Si celui-ci a été créé par l'activité, il s'agit donc du thread-UI.

    L'autre interêt du handler, est de pouvoir lui dire: ok poste ce message à tel moment dans le futur .... bien pratique non ?

    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
    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
     
    class MyActivity
    {
     
         private Runnable   LOAD_DATA_TASK = new Runnable() {
             public void run() {
                 MyActivity.this.startLoadingData();
             }
          };
     
         private Runnable   REFRESH_UI_TASK = new Runnable() {
             public void run() {
                  MyActivity.this.refreshUI();
             }
          };
     
     
     
         public onCreate(...)
         {
             // le handler executera tout dans le thread UI donc....
             this.handler = new Handler(); 
             startLoadingThread();
         }
     
         public void startLoadingThread()
         {
             new Thread(new Runnable() {
                 public void run() {
                     // loading des data....
     
                     // à la fin... on colle un message dans le handler:
                     MyActivity.this.handler.post(REFRESH_UI_TASK );
                 }
             }).start();
          }
     
     
         public refreshUI()
         {
               // on raffranchit l'UI
     
               // on schedule une MAJ
             this.handler.postDelayed(LOAD_DATA_TASK,500);
         }
    }
    Il y a bien un thread, mais plus de sleep !
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2013
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Suite à ta remarque necroman (MERCI)

    n'ayant pas rafraichi la page du forum je n'ai pas vu ton dernier message de "22h.." donc je suis parti sur ce qui ce trouve ci-dessous.
    Je vais quand même essayer ta méthode du message de "22h.." que j'ai pas vu.

    J'ai fait les choses suivantes:

    Dans la méthode onCreate de mon activité principale, j'ai mis:
    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
     
    new Thread(new Runnable() 
    		{
        		@Override
        		public void run() 
        		{
        			while(true)
        			{
        			remplissageDonnees();
        			posFragment = pager.getCurrentItem();
                	UpdateIHM();
                	Log.i("FragmentsSliderActivity.class","Run permanent");
                	try {
    					Thread.sleep(500);
    				} catch (InterruptedException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
        			}
    	       } 	
            }).start();
    Je ne sais toujours pas comment faire pour venir afficher toutes les 500ms
    donc pour le moment j'utilise Thread.sleep(500);

    Si tu pouvais me donner la solution pour temporise mon affichage -> Merci ^_^

    Dans une autre méthode j'ai mis:
    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 UpdateIHM()
    	    {
    	    	//Déposer le Runnable dans la file d'attente de l'UI thread
    	    	runOnUiThread(new Runnable() 
    	    	{
    		           @Override
    		           public void run() 
    		           {
    		           		//code exécuté par l'UI thread
    		        	   //affichageDonnes();
    			   			Log.i("FragmentsSliderActivity.class","Run UI");
    						m=1;
    						handler.sendMessage(handler.obtainMessage(m));
    		           }
    	        });
    	    }
    Je suis obligé de passer par un handler car si je mets mon affichage

    ==> ex: test=(TextView)findViewById(R.id.affichage1);
    test.setText("Cool");
    mon appli plante

    la méthode handler:
    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
     
    Handler handler = new Handler() 
    	 {
     
    	        @Override
    	        public void handleMessage(Message msg)
    	        {
    	        	//Log.i("FragmentsSliderActivity.class","Methode Handler");
    	            if(m==1)
    	            {
    	            	affichageDonnes();
    	            }
     
    	        }
    	 };
    la méthode qui gère l'affichage des données:
    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
     
    public void affichageDonnes()
    	 {
    		 	posFragment = pager.getCurrentItem();
    		 	chargeBatteriePermanent1=(ProgressBar)findViewById(R.id.chargeBatteriePermanent);
    		 	chargeBatteriePermanent1.setProgress(Donnees[0]);
    			Log.i("FragmentsSliderActivity.class","Page visionner N°"+posFragment);
    			switch(posFragment)
    			{
    	 			case 0:
    	 				Log.i("FragmentsSliderActivity.class","Page "+posFragment);
    		         	progressBarChargeBatterie1=(ProgressBar)findViewById(R.id.progressBarChargeBatterie);
    		 			progressBarChargeBatterie1.setProgress(Donnees[0]);
    		 			tempBatterie1=(TextView)findViewById(R.id.tempBatterie);
    		         	tempBatterie1.setText(String.valueOf(Donnees[1])+"°C");
    		         	break;
     
    	 			case 1:
    	 				Log.i("FragmentsSliderActivity.class","Page "+posFragment);
    	 				tempMoteur1=(TextView)findViewById(R.id.tempMoteur);
    	 				tempMoteur1.setText(String.valueOf(Donnees[2])+"°C");
    	 				break;
     
    	 			case 2:
    	 				break;
     
    	 			case 3:
    	 				break;
     
    	 			case 4:
    	 				break;
     
    	 			case 5:
    	 				break;
    			}
    	 }

    Mon appli tourne sans problème
    je peux changer de fragment sans que l'appli plante et mes textview sont bien rafraichis (nouvelles données qui s'affichent)

    Mais je voudrai savoir si mon raisonnement est bon et si je dois faire attention à certaine erreur qui pourrait survenir lorsque je change de fragment
    (le changement de fragment ce fait en faisant un slide sur la droite ou la gauche)
    je récupère la position du fragment et en fonction de la position récupérée, je viens afficher les données dans les textview.

    le problème qui pourrait arriver à mon avis est:
    Lorsque je viens changer de fragment, ma position change.
    donc se pourrait- il que lorsque le thread compare la valeur du switch qui contient la position du fragment et que cette position vienne à changer en même temps (Du à un slide). Est-ce-que l'appli pourrait planter?

    Ai-je raison ?

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2013
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Après avoir testé ton exemple nicroman, je pense que je vais le garder.
    J'ai du créer un deuxième handler pour pouvoir afficher dans mes textview.

    Je met mon code ci-dessous:


    Code:
    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
    105
    106
    107
    108
    109
    110
    111
     
     
    class test
    {
            protected void onCreate(Bundle savedInstanceState) 
            {
             ....
             .....
    	this.handler = new Handler(); 
            startLoadingThread();
    	}	
     
     
    	private Runnable   LOAD_DATA_TASK = new Runnable() // permet de relancer le thread tous les 100ms (pour mon cas)
    	{
            public void run()
            {
            	test.this.startLoadingThread();
            }
         };
     
        private Runnable   REFRESH_UI_TASK = new Runnable() // permet de relancer le thread qui rafraichi l'affichage
        {
            public void run() 
            {
                    Log.i("test.class","Thread UI");
            	test.this.refreshUI();
            }
         };
     
         public void startLoadingThread() // thread qui gère toutes les actions "lourdes" (calcul, etc) 
         {
             new Thread(new Runnable() 
             {
                 public void run() 
                 {
                     // Chargement des data....
                	 remplissageDonnees();
                	 Log.i("test.class","Thread Data");
                     // à la fin... on colle un message dans le handler:
                	 test.this.handler.post(REFRESH_UI_TASK );
                 }
             }).start();
          }
     
         public void refreshUI() // méthode qui gère l'affichage
         {
             // on raffranchit l'UI
        	 m=1;
        	 handler1.sendMessage(handler.obtainMessage(m));
             // on regle la tempo de la MAJ de l'affichage
             this.handler.postDelayed(LOAD_DATA_TASK,100);
         }
     
         Handler handler1 = new Handler()  // handler qui permet de lancer l'affichage
    	 {
     
    	        @Override
    	        public void handleMessage(Message msg)
    	        {
    	        	//Log.i("test.class","Methode Handler");
    	            if(m==1)
    	            {
    	            	affichageDonnes();
    	            } 
    	        }
    	 };
     
    	public void remplissageDonnees()
    	{
    		int i;
    		for(i=0;i<9;i++)
    		{
    			Donnees[i]=(int)(Math.random() * (100-0)) + 0;
    		}
    	}
     
    	public void affichageDonnes()
    	{
    		affichagePermanent();
                    posFragment = pager.getCurrentItem(); // récupère la position de mon fragment 
    		switch(posFragment)
    		{
     			case 0:
     				prioriteNiveau5();
    	         	break;      
     			case 1:
     				prioriteNiveau4();
     				break;		
     			case 2:
     				prioriteNiveau3();
     				break;			
     			case 3:
     				prioriteNiveau2();
     				break;	
     			case 4:
     				prioriteNiveau1();
     				break;	
     			case 5:
     				prioriteNiveau0();
     				break;
    		}
    	}
     
    	public void affichagePermanent()
    	{
    		Log.i("test.class","Page visionner N°"+posFragment);
    	 	chargeBatteriePermanent1=(ProgressBar)findViewById(R.id.chargeBatteriePermanent);
    	 	chargeBatteriePermanent1.setProgress(Donnees[0]);
    	}
    }

    Nicroman, je voulais savoir si je pouvais écrire d'une façon différente le code du 2ème handler (celui qui me permet de lancer la méthode affichageDonnes()

    soit:
    m=1;
    handler1.sendMessage(handler1.obtainMessage(m));

    qui m'envoi dans la méthode handler1()
    Une méthodes qui sert pas a grand chose à part lancer l'affichage.

    Peut-on faire de cette façon? ou dans le même genre?
    Je dirai que cela n'est pas possible vue la doc "handler"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test.this.handler.post(affichageDonnes());

  10. #10
    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
    Non ce n'est pas possible

    D'ou l'utilisation du runnable REFRESH_UI_TASK ... qui evite toute la gestion du message (et du coup, possibilité de réutiliser le premier handler)

    Parce-que sur un runnable c'est possible
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2013
    Messages : 39
    Points : 14
    Points
    14
    Par défaut
    Donc tu veux dire (Nicroman), que je peux réutiliser le même handler pour faire les deux actions que je réalise?

    Je doit donc supprime la ligne de code qui ce trouve dans la méthode onCreate(....)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.handler = new Handler();
    et j'utilise le handler suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Handler handler1 = new Handler()  // handler qui permet de lancer l'affichage
    	 {
     
    	        @Override
    	        public void handleMessage(Message msg)
    	        {
    	        	//Log.i("test.class","Methode Handler");
    	            if(m==1)
    	            {
    	            	affichageDonnes();
    	            } 
    	        }
    	 };
    Pour venir lancer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AvionSolaire6slides.this.handler.post(REFRESH_UI_TASK );
    //et
     m=1;
    handler1.sendMessage(handler.obtainMessage(m));

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    J'ai du mal à comprendre pourquoi l'appli arrête de fonctionner lorsque à la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void refreshUI() // méthode qui gère l'affichage
         {
             // on raffranchit l'UI
        	 m=1;
        	 handler1.sendMessage(handler.obtainMessage(m));
             // on regle la tempo de la MAJ de l'affichage
             this.handler.postDelayed(LOAD_DATA_TASK,100);
         }
    je met juste l'appel de la méthode qui gère l'affichage soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void refreshUI() // méthode qui gère l'affichage
         {
             // on raffranchit l'UI
        	 affichageDonnes();
             // on regle la tempo de la MAJ de l'affichage
             this.handler.postDelayed(LOAD_DATA_TASK,100);
         }
    Car on se trouve bien dans la méthode refreshUi(), celle qui gère l'affichage.



    Deuxième problème que j'ai rencontré:
    Détruire le ou les thread lorsqu'on arrête l'appli
    Ou mettre le ou les thread en Pause lorsqu'on souhaite juste passer sur une autre appli ou autre.

    -> Si j'ai bien compris comment fonctionne mon appli
    - Mon appli possède 2 thread, le premier thread qui tourne en tache de fond et qui réalise les calculs etc. et le deuxième thread qui gère l'affichage.

    Donc lorsque je souhaite arrêter mon appli, je dois détruire mes thread.
    ---> Est qu'il y a un ordre à respecter ?
    ex: détruire le thread ui puis le thread calcul puis ferme l'appli

    Comment je fais pour détruire un thread qui n'a pas de "Nom"
    ex:
    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
     
    new Thread(new Runnable() //Comment je peut venir détruire ce thread ?
    {
                 public void run() 
                 {
                  .......
                 }
    }
     
    public void onDestroy()
    {
      // Destruction du ou des thread 
       .......
      super.onDestroy();
    }
    Merci d'avance à toutes les réponses que vous pourrez m'apporter.

Discussions similaires

  1. Problème d'affichage de deux TextView
    Par android84 dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 01/02/2013, 13h38
  2. Probléme d'affichage de la valeur de code barre dans un champ de saisie
    Par youssef_rjili dans le forum Windev Mobile
    Réponses: 30
    Dernier message: 28/07/2011, 10h12
  3. Réponses: 0
    Dernier message: 13/12/2010, 09h34
  4. [MySQL] Problème pour récupèrer les champs d'un formulaire qui se trouve dans un while
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 21/03/2008, 14h59
  5. [Oracle] Problème d'affichage de valeurs contenant un caractère blanc dans un champ
    Par domray dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/02/2007, 17h11

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