2013-02-17 6 views
3

자, 저는 자바와 안드로이드 프로그래밍 모두를 배우는 진정한 초보자입니다. 친절한 게임을위한 농구 응용 프로그램을 만들려고합니다. 지금 나는 24에서 0까지 세는 샷 클록을 만들고 사운드를 재생하며 버튼으로 리셋됩니다.안드로이드 타이머가 정확하지 않습니다.

public class MainActivity extends Activity { 
    private ShotClock shotClock; 
    private TextView shotClockTimer; 
    private Timer timer = new Timer(); 
    private Button shotClockReset; 
    private final static int interval = 100; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     shotClockTimer = (TextView) findViewById(R.id.shotClock); 
     shotClockReset = (Button)findViewById(R.id.shotClockReset); 
     shotClock = new ShotClock(); 
     shotClockReset.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       shotClock.shotClockReset(); 
      } 

     }); 
     timer = new Timer(); 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       TimerMethod(); 
      } 

     }, 0, interval); 

    } 

    private void TimerMethod() { 
     this.runOnUiThread(Timer_Tick); 
    } 

    private Runnable Timer_Tick = new Runnable() { 
     public void run() { 
      shotClock.advanceClock(); 
      shotClockTimer.setText(String.format("%.1f",shotClock.getSeconds())); 

     } 
    }; 
} 

아이디어는 내가 매 0.1 초마다 가고 그에 따라 시계를 업데이트한다는 타이머입니다. 이것은 잘 작동하고, 시계는 24-0부터 카운트하고 적절히 리셋됩니다. 내 문제는 그것이 정확하지 않다는 것입니다. 다른 3 개의 타이머로 테스트했는데 항상 약간 느립니다. 다른 타이머가 0에 도달 할 때까지이 타이머는 ~ 1 ~ 1.5 초 남았습니다. 원시 방식으로 간격을 변경하는 것 외에도 정확성을 높이려면 어떻게해야합니까? 제발, 내가 새로 왔기 때문에 친절하세요 :) 도움을 주셔서 감사합니다!

+1

PS : Java에서는 규칙 상 클래스/인터페이스 만 대문자로 시작합니다. – m0skit0

답변

5

내부 스케쥴러 때문에 스케쥴러가 약 0.1 초마다이 메소드를 호출합니다. 그러나 시스템 자체는 정확합니다. System.currentTimeMillis()를 사용하여이 오류를 해결하십시오.

Android 자체는 실시간 응용 프로그램이 아니지만 시스템은 사용자가 얻을 수있는 가장 정확한 소스입니다. 그래서 예를 들어 sportsevents 정밀한 스톱워치 프로그래밍

더 안드로이드 쓰임새 없다)

다만 루프 및 상기 오프셋에 도달하는 경우, 방법 호출, 밀리 초 단위의 오프셋을 계산한다.

여기에도 부정확성에 대해 생각해보십시오. 마지막 값이 아니라 시작 시간 (1 * 0.1 초, 2 * 0.1 초 ...)으로 항상 오프셋을 계산하십시오. 따라서 여기에서 부정확성을 최소화하십시오.

+0

그게 옳은 방법입니다. 시작할 때 System.currentTimeMillis()를 저장하면 각 간격마다 그 값에서 남은 시간을 계산할 수 있습니다. 정확한 간격이없는 경우에도 표시되는 값은 정확합니다. – Schlangi

+0

이것은 효과가 있습니다. 아직 정확한 것은 아니지만 이전보다 훨씬 좋습니다! 고마워요! – Egozy