Android - Chronometer setBase() 无法正常工作

Android - Chronometer setBase() doesn't work properly

我发现如果我在 setBase(SystemClock.elapsedRealtime()) 之后立即调用 start() 它将从 00:00 开始计数(这很好),见下文:

startButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        chronometer.setBase(SystemClock.elapsedRealtime());
        chronometer.start();
    }
});

但是,如果我像这样将 setBase(SystemClock.elapsedRealtime()) 放在 setOnCLickListener() 之外:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    chronometer = findViewById(R.id.main_chronometer);
    startButton = findViewById(R.id.main_start_button);
    resetButton = findViewById(R.id.main_reset_button);

    chronometer.setBase(SystemClock.elapsedRealtime());    //no good here

    startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //chronometer.setBase(SystemClock.elapsedRealtime());
            chronometer.start();
        }
    });
}

它将从该应用程序启动后经过的时间开始计算。为什么?

您描述的行为是由用户交互的异步性质引起的。你的两个例子可以分解如下:

onClick

中调用 setBase
  1. 应用启动
  2. UI已配置;点击侦听器设置在按钮上
  3. 时间流逝...
  4. 用户点击按钮
  5. 计时器基线设置为当前时间
  6. 计时器已启动

请注意,在第 5 步(设置计时器基线)和第 6 步(启动计时器)之间没有时间流逝,这就是为什么当您检查其值时计时器正确地从 0 开始。

onCreate 内部和 onClick 外部调用 setBase

  1. 应用启动
  2. UI已配置;点击侦听器设置在按钮上
  3. 计时器基线设置为当前时间
  4. 时间流逝...
  5. 用户点击按钮
  6. 计时器已启动

在此版本中,时间在第 3 步(已设置计时器基线)和第 6 步(已启动计时器)之间流逝,这就是为什么当您检查其值时计时器不会从 0 开始。