4

好的,所以,我是一个真正的 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 秒。除了以原始方式更改间隔之外,我还能做些什么来使其更准确?请保持友好,因为我是新手 :) 感谢您的帮助!

4

1 回答 1

8

那是因为内部调度,调度器大约每 0.1 秒调用一次这个方法。但是,系统本身是准确的。使用 System.currentTimeMillis() 更正此错误。

Android 本身不是实时应用程序,但系统是您可以获得的最准确的来源。

因此,例如为体育赛事编写精确的秒表在 android 中是没有用例的;)

只需循环并计算毫秒的偏移量,如果达到偏移量,则调用方法。

但也要考虑这里的不准确性。始终使用开始时间(1*0.1 秒、2*0.1 秒...)计算偏移量,而不是使用最后一个值,因此在此处尽量减少不准确性。

于 2013-02-17T09:43:49.190 回答