【问题标题】:How can I update an on-screen countdown exactly when the system clock ticks on Android如何在 Android 系统时钟滴答声时准确更新屏幕倒计时
【发布时间】:2021-04-14 15:19:17
【问题描述】:

我正在 Android 中进行倒计时,虽然我确实让倒计时大部分工作正常,但我遇到了一个问题。

这是我当前的代码:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    Date now = new Date();
    long timeUntilLaunch = launch.getNet().getTime() - now.getTime();
    countdownView.setText(countdownFormat.format(new Date(timeUntilLaunch)));

    handler.postDelayed(this, 1000);
  }
}, 1000);

这可行,但我现在面临的主要问题是,这将每秒更新一次,从这部分代码执行的时间开始,这意味着倒计时可能最多 1 秒。这是因为如果它在秒计时后运行 900 毫秒,倒计时将等到 x.9 秒再刷新。

我解决这个问题的第一种方法是使用一个空的 while 循环,它会等到秒数滴答作响,然后让它运行,但我很快发现这是一个糟糕的主意,因为它会冻结整个应用程序。

最好的方法是什么?

【问题讨论】:

  • Android 有一个名为 CountDownTimer 的类,在这里查看:developer.android.com/reference/android/os/CountDownTimer
  • 我这样做了,但似乎行为完全一样,所以倒计时不会在系统时钟更新的那一刻立即更新
  • @YonatanAvhar 我能问一下为什么你希望它在系统时钟更新的那一刻准确更新吗?
  • 是的,我应该澄清这一点。我在 RecyclerView 中有多个视图,并且在滚动时,只要用户滚动,处理程序完成的任务就会被调用,这意味着屏幕上的 6 个左右的计时器不会一次全部更新,这看起来很糟糕(它也惹恼了我的“强迫症”)。

标签: java android countdown clock


【解决方案1】:

我找到了解决问题的方法。我没有总是以 1000 毫秒的延迟触发 Handler,而是给它一个 1000 - (now.getTime() % 1000) 的延迟,这意味着它会一直等到第二个滴答声再次更新。这是我完成的代码:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    Date now = new Date();
    long timeUntilLaunch = launch.getNet().getTime() - now.getTime();
    countdownView.setText(countdownFormat.format(new Date(timeUntilLaunch + 1000)));

    handler.postDelayed(this, 1000 - (now.getTime() % 1000));
  }
}, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多