Aller au contenu

Timer sous Android


bylkus59

Recommended Posts

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.

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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é par bylkus59
Lien vers le commentaire
Partager sur d’autres sites

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 :)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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();
               }
           });
       }
   }
}

Lien vers le commentaire
Partager sur d’autres sites

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?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...