Android-计时码表setBase()无法正常工作

时间:2019-09-03 21:09:17

标签: java android android-studio chronometer

我发现,如果我在start()之后立即致电setBase(SystemClock.elapsedRealtime()),它将从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();
        }
    });
}

从此应用启动以来,它将从经过的时间开始计数。为什么?

1 个答案:

答案 0 :(得分:1)

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

onClick内部呼叫setBase

  1. 应用启动
  2. 已配置用户界面;点击监听器设置在按钮上
  3. 时间过去了...
  4. 用户点击按钮
  5. 天文钟基线设置为当前时间
  6. 计时器已启动

请注意,在第5步(设置了天文台基准)和第6步(天文台已启动)之间没有时间经过,这就是为什么当您检查它的值时,天文台正确地从0开始。

setBase内部和onCreate外部呼叫onClick

  1. 应用启动
  2. 已配置用户界面;点击监听器设置在按钮上
  3. 天文钟基线设置为当前时间
  4. 时间过去了...
  5. 用户点击按钮
  6. 计时器已启动

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