好的,所以,我是java和Android编程的真正初学者。 我正在尝试为友谊赛制作一个篮球应用程序。现在我正在制作一个从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秒。除了以原始方式更改间隔之外,我还能做些什么来使其更准确? 因为我是新来的,请保持友好:) 谢谢你的帮助!
答案 0 :(得分:5)
那是因为内部调度, 调度程序大约每0.1秒调用一次此方法。 但是,系统本身是准确的。 使用System.currentTimeMillis()来更正此错误。
Android本身不是实时应用程序,但系统是您可以获得的最准确的来源。
因此,为sportsevents编程精确的秒表例如在android中没有用;)
只需循环并计算毫秒的偏移量,如果达到偏移量,则调用方法。
但是想想这里的不准确性。计算偏移始终与开始时间(1 * 0.1秒,2 * 0.1秒......),而不是最后一个值,因此最小化不准确性。