2012-01-31 6 views
1

나는 두 번째와 두 개의 콜론이 매초마다 바뀌면서 간단한 디지털 시계를 구현하려고합니다. 나는 DigitalClock을 사용하는 것에 대해 생각해 왔지만 두 번째뿐만 아니라 콜론도 번쩍이기를 원하고 am/pm을 보여주고 싶지는 않습니다. 그래서 나는 "타이머에서 UI 업데이트하기"를 읽고 우리에게 Handler를 사용할 것을 제안합니다. 그래서 Handler를 사용하고 매초마다 콜론과 초를 변경할 수 있지만 이상한 일은 때로는 초 점프 (1,2,4,5,6)입니다. 시계가 조금 뒤떨어져있는 것 같습니다. 이 문제를 해결할 방법이 있습니까? 감사!안드로이드 처리기 건너 뛰기/초 점프

tick_handler = new Handler(); 
    Runnable updateSecond = new Runnable(){ 
     @Override 
     public void run() { 
      second.setText(DataModel.getSeconds()); 
      if(colon1.getVisibility()== View.VISIBLE){ 
       colon1.setVisibility(View.INVISIBLE); 
       colon2.setVisibility(View.INVISIBLE); 
      } else { 
       colon1.setVisibility(View.VISIBLE); 
       colon2.setVisibility(View.VISIBLE); 
      } 
      tick_handler.postDelayed(this, 1000); 
     } 
    }; 
tick_handler.postDelayed(updateSecond, 0); 

답변

0

에뮬레이터에서 실제 전화기보다 느린 것으로 판단됩니다. tick_handler.postDelayed(this, 1000);을 1 초보다 작은 값으로 변경하십시오 (예 : 500 ms

tick_handler.postDelayed(this, 500); 

전역 변수를 추가하여 스레드가 실행될 때마다 차이를 추적하고 차이가 1 초인 경우보기를 업데이트하십시오.

+0

안녕하세요, 감사합니다. 에뮬레이터를 사용하고 있습니다. 단지 1000에서 500으로 바뀌었고 두 번째 점프가 중단되었지만 때로는 빠르게 변합니다 (34,35, 36로 빠르게 변경). 내가 Thread.sleep (1000)을 사용할 때 에뮬레이터에서이 문제를 실행할 수 있으며 같은 일이 발생합니다. 그래서 당신이 옳다고 생각하고 실제 기계를 시험해 보려고 노력할 것입니다. 감사! – Dongminator

+0

내 대답의 두 번째 부분을 놓친 것 같습니다. 스레드를 실행할 때마다 millis를 세는 전역 변수를 생성하고 second.setText() 메소드 만 실행하고 누적 값이 3600에 도달하면 뷰의 가시성을 변경해야합니다. –

+0

전역 변수 사용이 작동합니다! 감사! SystemClock.elapsedRealtime() - global_variable> 1000인지 확인한 다음 setText() 코드를 실행합니다. 다시 한 번 감사드립니다! – Dongminator