2017-02-08 18 views
1

체스 시계를 만들지 만 지연이 필요합니다 (카운트하기 전에 10 초 기다리는 것처럼). 핸들러를 사용했지만 버튼을 10 초 이내에 클릭하면 아무 일도 일어나지 않습니다. 도와주세요! 감사! 내 코드 :카운트 다운 타이머 지연 - 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); 

나는 지연을 원하지만 나는 UI를 고정하고 핸들러와 지금하고있는대로 응용 프로그램이 응답하지 만들고 싶어하지 않습니다. 어떤 도움을 주시면 감사하겠습니다! 미리 감사드립니다!

답변

2

그것을 실행하려는 경우 당신이에 CountdownTimer를 넣지해야한다고 생각 매니저. 대신에 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

안녕 Kharbanda, 당신이 언급 한 방법은 카운트 다운 타이머처럼 행동. 그리고 CountDown 타이머 클래스 대신 Handler를 사용하는 것이 좋습니다 이유는 다음과 같습니다. - 처리기는 CountDown 타이머 클래스보다 더 우수한 성능을 가져야합니다. 여기에서 유용한 정보를 찾을 수 있습니다. http://stackoverflow.com/questions/35497844/handler-postdelayedrunnable-vs-countdowntimer 또한 CounDown 타이머는 실제로 처리기를 코어에 구현했습니다. –

+0

고마워! 나는 당신의 설명이 웹 사이트뿐만 아니라 유용하다는 것을 알았다! 고마워. 하지만 확실히, 카운트 다운 타이머는 startHandlerAndWait10Seconds()의 메소드입니까? –

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

지연이 필요하지만 UI를 잠그고 앱이 응답하지 않게하고 싶습니다. –

+0

새 처리기가 새 스레드에서 실행됩니다. :) – sadat