Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Java & Mobiles > Android
Android Forum d'entraide sur Android, la plateforme mobile de Google pour téléphones portables et Smartphones. Avant de poster -> FAQ Android
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/02/2013, 16h05   #1
FunckyWarrior
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 23
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 : 23
Points : 1
Points : 1
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 :
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 :
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...
FunckyWarrior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 16h18   #2
nicroman
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 2 863
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Romantzoff
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 : 2 863
Points : 4 916
Points : 4 916
Envoyer un message via Skype™ à nicroman
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
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 16h28   #3
maxusn
Membre habitué
 
Homme
Étudiant
Inscription : octobre 2012
Messages : 92
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : octobre 2012
Messages : 92
Points : 110
Points : 110
Salut,

essaye :
Code :
textview1 = (TextView) getView().findViewById(R.id.affichage1);
si ça ne fonctionne pas, peux tu mettre les logs qui te sont renvoyés
maxusn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 18h13   #4
FunckyWarrior
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 23
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 : 23
Points : 1
Points : 1
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 :
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 :
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 :
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 :
1
2
 
tempBatterie1=(TextView)findViewById(R.id.tempBatterie);
FunckyWarrior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 19h36   #5
nicroman
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 2 863
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Romantzoff
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 : 2 863
Points : 4 916
Points : 4 916
Envoyer un message via Skype™ à nicroman
Moi je pense surtout que tu as un problème de conception...
Code :
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
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 21h05   #6
FunckyWarrior
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 23
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 : 23
Points : 1
Points : 1
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.
FunckyWarrior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 22h22   #7
nicroman
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 2 863
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Romantzoff
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 : 2 863
Points : 4 916
Points : 4 916
Envoyer un message via Skype™ à nicroman
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 :
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
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2013, 00h14   #8
FunckyWarrior
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 23
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 : 23
Points : 1
Points : 1
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 :
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 :
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 :
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 :
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 ?
FunckyWarrior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2013, 02h02   #9
FunckyWarrior
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 23
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 : 23
Points : 1
Points : 1
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 :
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 :
1
2
 
test.this.handler.post(affichageDonnes());
FunckyWarrior est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2013, 09h15   #10
nicroman
Modérateur
 
Homme Nicolas Romantzoff
Ingénieur systèmes et réseaux
Inscription : février 2007
Messages : 2 863
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Romantzoff
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 : 2 863
Points : 4 916
Points : 4 916
Envoyer un message via Skype™ à nicroman
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
nicroman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2013, 15h35   #11
FunckyWarrior
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 23
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 : 23
Points : 1
Points : 1
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 :
1
2
 
this.handler = new Handler();
et j'utilise le handler suivant:
Code :
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 :
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 :
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 :
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 :
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.
FunckyWarrior est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h51.


 
 
 
 
Partenaires

Hébergement Web