2017-02-08 3 views
1

Je fais une horloge d'échecs mais j'ai besoin d'un délai (Comme il attend 10 secondes avant de compter). J'ai utilisé un gestionnaire pour cela mais si le bouton est cliqué dans les 10 secondes, rien ne se passe. S'il vous plaît aider! Merci! Mon code:Délai pour CountDown Timer - Android

mHandler.postDelayed(new Runnable() { 
         public void run() { 
          // count down timer start 
          timer2 = new CountDownTimer(totalSeconds, Integer.parseInt(delay.getText().toString())) { 
           public void onTick(long millisUntilFinished) { 
            secondsTimer = (int) (millisUntilFinished/1000) % 60; 
            minutesTimer = (int) ((millisUntilFinished/(1000 * 60)) % 60); 
            hoursTimer = (int) ((millisUntilFinished/(1000 * 60 * 60)) % 24); 
            person2.setText(hoursTimer + ":" + minutesTimer + ":" + secondsTimer); 
           } 

           public void onFinish() { 
            person2.setText("Time Up!"); 
            person2.setBackgroundColor(Color.RED); 
            mp.start(); 
           } 
          }.start(); 
         } 
        }, finalDelay); 

Je veux un retard mais je ne veux pas verrouiller l'interface utilisateur et de faire l'application ne répond pas comme il le fait en ce moment avec le gestionnaire. Toute aide serait appréciée! Merci d'avance!

Répondre

2

Je pense que vous ne devriez pas mettre CountdownTimer en Gestionnaire. Vous pouvez créer 2 gestionnaires à la place. Voici un exemple.

private void startHandlerAndWait10Seconds(){ 
    Handler handler1 = new Handler(); 
    handler1.postDelayed(new Runnable() { 

     public void run() { 
      // Start Countdown timer after wait for 10 seconds 
      startCountDown(); 

     } 
    }, 10000); 
} 

private void startCountDown { 
    final Handler handler2 = new Handler(); 
    handler2.post(new Runnable() { 
     int seconds = 60; 

     public void run() { 
      seconds--; 
      mhello.setText("" + seconds); 
      if (seconds < 0) { 
       // DO SOMETHING WHEN TIMES UP 
       stopTimer = true; 
      } 
      if(stopTimer == false) { 
       handler2.postDelayed(this, 1000); 
      } 

     } 
    }); 
} 
+0

Merci, la réponse semble utile, mais pourriez-vous expliquer ce qui se passe dans la méthode 'startHandlerAfterWaited10Seconds()' J'ai upvoted votre réponse pour la trouver utile! –

+0

Hi Kharbanda, La méthode que vous avez mentionnée comme agissant comme compte à rebours. Et la raison pour laquelle je vous suggère d'utiliser Handler au lieu de CountDown timer class est: - Handler devrait avoir de meilleures performances que CountDown timer class. Vous pouvez trouver utile de se référer ici http://stackoverflow.com/questions/35497844/handler-postdelayedrunnable-vs-countdowntimer En outre, CounDown timer effectivement implémenté Handler dans son noyau. –

+0

Ok Merci! J'ai trouvé votre explication utile ainsi que le site web! Merci beaucoup. Mais juste pour être sûr, le compte à rebours est la méthode 'startHandlerAndWait10Seconds()' right? –

0

Si vous voulez lancer le chronomètre immédiatement,

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      new Handler().post(new Runnable() { 
       public void run() { 
        // count down timer start 
        new CountDownTimer(100000, 1000) { 
         public void onTick(long millisUntilFinished) { 
          button.setText(String.valueOf(millisUntilFinished)); 
         } 

         public void onFinish() { 
          button.setText("Time Up!"); 
         } 
        }.start(); 
       } 
      }); 
     } 
    }); 

Et si vous voulez l'exécuter après une certaine période de temps, puis

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      new Handler().postDelayed(new Runnable() { 
       public void run() { 
        // count down timer start 
        new CountDownTimer(100000, 1000) { 
         public void onTick(long millisUntilFinished) { 
          button.setText(String.valueOf(millisUntilFinished)); 
         } 

         public void onFinish() { 
          button.setText("Time Up!"); 
         } 
        }.start(); 
       } 
      }, 1000); 
     } 
    }); 
+1

Je ne veux un retard mais je ne veux pas verrouiller l'interface utilisateur et de faire l'application ne répond pas. –

+0

nouveau gestionnaire s'exécutera dans un nouveau thread je suppose. :) – sadat