Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Timer

Sujet résolu
    10 mai 2012 à 11:41:46

    Bonjour,

    je suis actuellement un tuto pour la création d'un timer dans une application.
    Le tuto est celui ci :

    package com.android.countdown;
        import android.app.Activity;
        import android.os.Bundle;
        import android.os.CountDownTimer;
        import android.widget.TextView;
    
        public class CountDownTest extends Activity {
    
        TextView tv; //textview to display the countdown
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        tv = new TextView(this);
        this.setContentView(tv);
    
        //5000 is the starting number (in milliseconds)
        //1000 is the number to count down each time (in milliseconds)
        MyCount counter = new MyCount(5000,1000);
    
        counter.start();
    
        }
    
        //countdowntimer is an abstract class, so extend it and fill in methods
        public class MyCount extends CountDownTimer{
    
        public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
        }
    
        @Override
        public void onFinish() {
        tv.setText(”done!”);
        }
    
        @Override
        public void onTick(long millisUntilFinished) {
        tv.setText(”Left: ” + millisUntilFinished/1000);
    
        }
    
        }
        }
    


    Toutefois, je n'arrive pas a accéder a mon TextView dans ma classe MyCount. Quelqu'un pourrait il m'éclairer?
    • Partager sur Facebook
    • Partager sur Twitter
      10 mai 2012 à 12:17:03

      Bonjour,

      Ton indentation et ta structure n'est pas top mais soit.
      As-tu une erreur ? Logiquement, tu peux y accéder donc je ne vois rien de choquant dans ton code.
      • Partager sur Facebook
      • Partager sur Twitter
      Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
        10 mai 2012 à 13:47:51

        en fait j'ai mon fichier GestionTimerActivity.java dans lequel j'ai ma classe GestionTimerActivity, et mon fichier MyCount.java dans lequel se trouve ma classe MyCount. Mais je n'arrive pas a accéder a mon textview depuis le fichier MyCount.java
        • Partager sur Facebook
        • Partager sur Twitter
          10 mai 2012 à 13:59:40

          Ah d'accord, ce sont deux classes différentes (à l'avenir, tu pourrais mettre chaque classe dans sa propre balise zCode "code" sinon c'est pas clair).

          Si je comprends bien ta démarche, tu as mis tes deux classes dans le même package et tu as placé ton TextView en friendly pour y avoir accès dans chaque classe de ce même package.

          Si c'est bien ça, c'est pas vraiment comme ça que ça marche. Le TextView est bien visible par toutes les classes présentes mais uniquement à travers une instance. Ceci devrait marcher :

          public class MaClasse1 {
             TextView tv;
          
             // le reste de la classe ...
          }
          


          public class MaClasse2 {
             
             public void methodeQuelconque() {
                MaClasse1 instance = new MaClasse1();
                Log.v("TAG", "TextView : " + instance.tv.getText());
             }
          
             // le reste de la classe ...
          }
          

          Les 2 classes doivent être dans le même package sinon MaClasse2 n'a pas accès à l'attribut.

          Bien sûr, ça serait stupide d'instancier ton activité. A mon avis, la méthode la plus élégante serait de mettre ta classe MyCount en classe interne pour avoir accès aux attributs de sa classe parent CountDownTest.
          • Partager sur Facebook
          • Partager sur Twitter
          Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
            10 mai 2012 à 15:49:18

            Merci beaucoup, j'ai fais comme tu me l'a conseillé et ça fonctionne niquel.
            Seul petit bémol c'est lorsque le timer tombe a zéro, j'ai l'impression qu'il lui faut deux secondes pour passer de 1 a 0.
            • Partager sur Facebook
            • Partager sur Twitter
              10 mai 2012 à 15:53:52

              Je n'ai jamais du programmé de timer mais je vois difficile comment ça pourrait être lié à la structure que je t'ai proposé. ^^
              Pour en être sûr, tu peux afficher dans les Log la différence entre chaque seconde du timer grâce à quelque chose comme ça :

              long t1 = SystemClock.currentThreadTimeMillis();
              // Faire la seconde ici
              Log.v(TAG, "Time : " + (SystemClock.currentThreadTimeMillis()-t1));
              

              Mais je ne sais pas si tu sais faire ce genre de test avec CountDownTimer.
              • Partager sur Facebook
              • Partager sur Twitter
              Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                10 mai 2012 à 20:20:43

                Je n'ai jamais utilisé Log.v, mais la j'ai une erreur sur TAG.
                Sinon si tu pouvais m'expliquer en quoi consiste ces deux lignes, car je ne vois pas vraiment :ninja:
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mai 2012 à 9:12:46

                  Log


                  Sans doute l'un des outils, si ce n'est l'unique outil, de debuggage réellement utile dans un développement Android. C'est quelque chose que tout développeur Android doit connaitre et doit utiliser. Il permet donc tout simplement de confectionner tes propres logues. Ces logs sont ensuite accessibles dans le LogCat que tu connais j'espère puisque toutes erreurs ou informations y sont renseignées. (Sur Mac : Window > Show View > LogCat).

                  Il en existe plusieurs dérivés qui indique le degré de priorité : http://developer.android.com/reference [...] util/Log.html

                  Son utilisation est très simple : Tu indiques un TAG sur laquelle tu pourras filtré dans le logcat si tu le souhaites et le message que tu veux afficher. Dans mon exemple de code plus haut, "TAG" est en fait une constante qui prend la valeur que tu souhaites.

                  Je ne peux que t'encourager à l'utiliser plutôt que de le faire avec des Toast.

                  Explications


                  Pour mon code, la documentation aurait pu te renseigner mais voici une première explication :
                  // Ici je demande à SystemClock de me donner le temps en milliseconde au moment où il tombe sur cette instruction
                  long t1 = SystemClock.currentThreadTimeMillis();
                  // Faire les opérations qu'on veut mesurer ici.
                  // ...
                  // J'affiche dans le LogCat la différence entre le temps sauvegarder avant l'opération et le temps récupéré maintenant
                  Log.v(TAG, "Time : " + (SystemClock.currentThreadTimeMillis()-t1));
                  

                  Donc, il m'affichera en combien de secondes la tâche que je tente de mesurer s'est effectuée.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                    11 mai 2012 à 20:21:57

                    Merci pour ces info, je connais le LogCat mais c'est juste que j'ai une erreur a "TAG".
                    Je testerais lundi car je ne suis pas en mesure de pouvoir tester ça pour le moment.
                    Merci :)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Android] Timer

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown