Java Android计时器不精确

Java Android计时器不精确,java,android,timer,Java,Android,Timer,好的,我是java和android编程的真正初学者。 我正在为友谊赛做一个篮球申请。现在我正在制作一个从24计数到0的shotclock,播放一个声音,并通过一个按钮重置 public class MainActivity extends Activity { private ShotClock shotClock; private TextView shotClockTimer; private Timer timer = new Timer(); privat

好的,我是java和android编程的真正初学者。 我正在为友谊赛做一个篮球申请。现在我正在制作一个从24计数到0的shotclock,播放一个声音,并通过一个按钮重置

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.1秒调用一次此方法。 然而,系统本身是准确的。 使用System.currentTimeMillis()更正此错误

Android本身不是实时应用程序,但该系统是您能获得的最准确的源代码

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

只要循环并计算毫秒的偏移量,如果达到偏移量,调用一个方法


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

这是正确的方法。您只需在开始时存储System.currentTimeMillis(),并在每个时间间隔从该值计算剩余时间。然后,如果没有精确的间隔,则显示的值是精确的。这是有效的。仍然不是100%精确,但比以前好多了!谢谢!System.currentTimeMillis是自历元起的毫秒。现在想想这个非常糟糕的场景。你的手机在周末完全放电,或者你确实卸下了电池。通常,当手机/标签被唤醒时,时钟会完全关闭。当你上网时,时钟应该(而且在大多数情况下)在几秒钟后变为正确的时间。如您所见,在这种情况下,System.currentTimeMillis在发生这种情况时也会发生剧烈变化。您可以添加一个监听Intent.ACTION\u TIME\u的BroadcastReceiver来检测它,但我怀疑它是否能够足够快地触发0.1secPS:按照惯例,在Java中,只有类/接口以大写开头。