bylkus59 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 Bonjour, Je développe depuis peu sous android et la j'ai essayé d'utiliser un Timer mais impossible que cela fonctionne. Voici mon code : public class TestTimer extends Activity { /** Called when the activity is first created. */ Timer t; //@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); t = new Timer(); t.scheduleAtFixedRate(new Action(),6000,6000); } class Action extends TimerTask{ public void run(){ Toast my_message = Toast.makeText(TestTimer.this,"Cool", Toast.LENGTH_SHORT ); my_message.show(); } } } Ce code est-il bon ? Car à chaque fois que je veux l'exécuter dans l'emulator Android il me lance une erreur dès le début. Pourriez-vous m'aider please. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
moritan Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 C'est quoi comme erreur ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 The application TestTimer (process test.timer) has stopped unexpectedly. Please Try Again Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Femto Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 (modifié) Je n'ai jamais utilisé de timer mais je remarque que ta méthode "run" de ta classe timertask n'est jamais appelée Modifié 22 septembre 2010 par Femto Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 The application TestTimer (process test.timer) has stopped unexpectedly. Please Try Again Va falloir apprendre à utiliser le logcat ( disponible dans eclipse ou ddms) si tu veux de l'aide! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 Femto si il est appelé lorsque je fais le new Action() ! Et Profete162 peut m'expliquer comment fonctionne le logcat stp. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 Merci pour ta recherche. Windows -> show view -> logcat ( ou autre si il n'est pas par défaut) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 (modifié) Merci Modifié 22 septembre 2010 par bylkus59 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 voici ce qu eme donnes logcat : 09-22 11:59:30.366: ERROR/AndroidRuntime(932): FATAL EXCEPTION: Timer-0 09-22 11:59:30.366: ERROR/AndroidRuntime(932): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 09-22 11:59:30.366: ERROR/AndroidRuntime(932): at android.os.Handler.(Handler.java:121) 09-22 11:59:30.366: ERROR/AndroidRuntime(932): at android.widget.Toast.(Toast.java:68) 09-22 11:59:30.366: ERROR/AndroidRuntime(932): at android.widget.Toast.makeText(Toast.java:231) 09-22 11:59:30.366: ERROR/AndroidRuntime(932): at test.time.TestTime$Action.run(TestTime.java:36) 09-22 11:59:30.366: ERROR/AndroidRuntime(932): at java.util.Timer$TimerImpl.run(Timer.java:289) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 la réponse est dans le message d'erreur :) Il faut faire Looper.prepare() avant d'utiliser Timer n'oublie pas d'appeller Looper.myLooper().quit() à la fin (je suppose que c'est utile) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 Merci Pierre87 j'avais pas vu Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 (modifié) Merci maintenant le programme se lance bien mais ne fonctionne pas car il ne m'affiche pas mes toast je ne comprends rien car si j'utilise ça dan sun projet java et remplace le toast par SyStem.out.println cela marche nickel mais dès que je passe sous Android rien ne fonctionne. Voici mon code : package test.time; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.Bundle; import android.os.Looper; import android.widget.Toast; public class TestTime extends Activity { /** Called when the activity is first created. */ Timer t; int i = 0; //@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); t = new Timer(); t.schedule(new Action(),0,1000); } class Action extends TimerTask{ public void run(){ Looper.prepare(); if(i==0){ Toast my_message; my_message = Toast.makeText(TestTime.this,"Cool", Toast.LENGTH_SHORT ); my_message.show(); } //Looper.myLooper().quit(); Looper.loop(); } } } Modifié 22 septembre 2010 par bylkus59 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 C'est lié au Thread qui exécute ton code. Ca veut dire qu'il faut que ce soit le MEME thread qui exécute : Looper.prepare() t = new Timer(); t.scheduleAtFixedRate(new Action(),6000,6000); Looper.myLooper().quit() Ce que je te conseille de faire en pratique : dans ton onCreate : Looper.prepare() t = new Timer(); t.scheduleAtFixedRate(new Action(),6000,6000); dans ton onDestroy : t.cancel() Looper.myLooper().quit() Il faut donc que tu gardes ton Timer en variable d'instance Tu peux aussi placer ton code dans onStart/onStop ou onResume/onPause (tout dépend de ce que tu veux faire) Je pense que ça devrait marcher (n'étant pas un spécialiste sur ce point... ), mais c'est ce que je ferai :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 Merci beaucoup pour tes conseils pierre87 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 oups désolé, je viens de m'apercevoir que mon raisonnement est erroné :s ce n'est pas Timer qui nécessite un Looper, mais le Toast :s tout ce que je t'ai dit n'est donc pas valide (j'avais mal lu le message d'erreur) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 si j'étais toi, j'essayerai plutôt d'exécuter le code de ton Toast dans le thread graphique... (via Activity.runOnUiThread(Runnable action)) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 Ce n'est pas grave Pierre87 cela arrive à tout le monde et je vais pas me plaindre car tu es l'un des rares à me donner un coup de main. J'ai mis précédemment cette fois-ci l'application se lance sans erreur mais elle n'effectue rien! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 Oula là je n'ai rien compris je ne vois même pas de quoi tu parle donc pourrais-tu m'expliquer où me donner un morceau de code m'illustrant ton propos stp Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 je vais essayer de voir ce que je peux faire avec ton code... (moi aussi ça m'intéresse) je poste un message si j'ai une solution Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 Une solution pas très élégante, mais qui marche : public class TestTimer extends Activity { Timer t; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); t = new Timer(); t.scheduleAtFixedRate(new Action(), 6000, 6000); } protected void onDestroy() { super.onDestroy(); t.cancel(); } class Action extends TimerTask { public void run() { TestTimer.this.runOnUiThread(new Runnable() { public void run() { Toast my_message = Toast.makeText(TestTimer.this, "Cool", Toast.LENGTH_SHORT); my_message.show(); } }); } } } Utiliser Toast nécessite de se trouver dans le UI Thread Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 Beh je te remercie grandement Pierre87 tu m'as été d'un grand secours ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 c'est la seule solution que j'ai trouvé :/ Afficher un Toast nécessite d'être dans le main/UI thread Or, l'exécution d'une TimerTask se fait dans un AUTRE thread Il faut donc demander explicitement à ce que l'action soit faite dans le UI thread Il y a peut être un moyen plus simple de le faire, mais je ne le connais pas... Un code qui explique un peu mieux : public class TestTimer extends Activity { Timer t; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); t = new Timer(true); t.scheduleAtFixedRate(new Action(), 6000, 6000); System.out.println("UI thread : " + Thread.currentThread().getName()); } protected void onDestroy() { super.onDestroy(); t.cancel(); } class Action extends TimerTask { public void run() { System.out.println("action thread : " + Thread.currentThread().getName()); TestTimer.this.runOnUiThread(new Runnable() { public void run() { System.out.println("toast thread : " + Thread.currentThread().getName()); Toast my_message = Toast.makeText(TestTimer.this, "Cool", Toast.LENGTH_SHORT); my_message.show(); } }); } } } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 Merci grâce à ton code et tes explications j'ai compris mon erreur et le fonctionnement du timer. Moi je pensais que par defaut le toast savait qu'il devait s'afficher dans le main/Ui threads et non que je devais explicitement lui indiquer. En tout cas encore merci car je ne pensais jamais en voir le bout de ce problème. Et Pierre87 j'ai une petite information à te demander! As-tu déjà programmer une application android utilisant l'API android.bluetooth? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 septembre 2010 Share Posté(e) 22 septembre 2010 Oui, généralement, toute action qui a un impact sur l'affichage nécessite d'être exécutée par le thread main/UI/graphique. Oui, j'ai déjà utilisé le bluetooth (c'est à la fois simple et compliqué) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
bylkus59 Posté(e) 22 septembre 2010 Auteur Share Posté(e) 22 septembre 2010 a beh génial car impossible de trouver un tuoriel clair expliquant toutes les étapes nécessaires! Pourrais-tu si cela ne te derange pas m'envoyer ton code source de cette application afin de voir comment se déroule les différentes étapes comme : Allumage bluetooth Detection autre périphérique Connexion au périphérique Et Envoi et Reception de données Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.