2017-02-08 3 views
1

Я делаю шахматные часы, но в нем мне нужна задержка (как и до 10 секунд до подсчета). Я использовал обработчик для него, но если нажата кнопка за 10 секунд, ничего не происходит. Пожалуйста помоги! Благодаря! Мой код:Задержка для таймера CountDown - 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); 

Я хочу задержку, но я не хочу, чтобы заблокировать интерфейс и сделать приложение не отвечает, как это делает сейчас с обработчиком. Любая помощь будет оценена! Заранее спасибо!

ответ

2

Я думаю, что вы не должны положить CountdownTimer в Handler. Вместо этого вы можете создать 2 обработчика. Вот пример.

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

Спасибо, ответ выглядит полезным, но вы могли бы объяснить, что происходит в методе 'startHandlerAfterWaited10Seconds()' Я получил ваш ответ, хотя для того, чтобы найти его полезным! –

+0

Hi Kharbanda, Метод, о котором вы говорили, действует как таймер обратного отсчета. И причина, по которой я предлагаю вам использовать Handler вместо класса таймера CountDown, это: - Обработчик должен иметь лучшую производительность, чем класс таймера CountDown. Вы можете найти полезную ссылку здесь http://stackoverflow.com/questions/35497844/handler-postdelayedrunnable-vs-countdowntimer Кроме того, таймер CounDown фактически реализовал обработчик в своем ядре. –

+0

Хорошо Спасибо! Я нашел ваше объяснение полезным, а также веб-сайт! Большое спасибо. Но чтобы убедиться, таймер обратного отсчета - это метод 'startHandlerAndWait10Seconds()' right? –

0

Если вы хотите, чтобы запустить таймер сразу,

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

И если вы хотите, чтобы выполнить его по истечении определенного периода времени, а затем

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

Мне нужна задержка, но я просто не хочу блокировать пользовательский интерфейс и сделать приложение невосприимчивым. –

+0

новый обработчик будет работать в новой теме. :) – sadat