如何在 java.util.Timer 中获得剩余时间?

How to get time left in a java.util.Timer?

如何获得util.Timer中的剩余时间? 我想要做的是添加一个进度条,显示剩余时间,直到计时器重新开始。

这就是我到目前为止所得到的:

int seconds = 8;

java.util.Timer timer = new Timer();
timer.schedule( new TimerTask(){
    public void run(){
        // Do something
        // Add a progressbar that displays time left until the timer "starts over".
    },0,(long) (seconds*1000));

您需要第二个计时器以特定时间间隔刷新 gui。
实现此目的的另一种方法是每秒激活一个计时器并更新 ui 中的计数。如果时间到了,请调用您的具体操作。

一个只有控制台输出的简单例子:

TimerTask task = new TimerTask()
{
    int seconds = 8;
    int i = 0;
    @Override
    public void run()
    {
       i++;

       if(i % seconds == 0)
           System.out.println("Timer action!");
       else
           System.out.println("Time left:" + (seconds - (i %seconds)) );
    }
};

Timer timer = new Timer();
timer.schedule(task, 0, 1000);

它的输出将是:

Time left:7
Time left:6
Time left:5
Time left:4
Time left:3
Time left:2
Time left:1
Timer action!
Time left:7
Time left:6
Time left:5
Time left:4
Time left:3
Time left:2
Time left:1
Timer action!
Time left:7
Time left:6
...

然后只需用您的代码更改 System.out 即可更新进度条。请记住:java.util.Timer 启动它自己的 Thread。 Swing 不是线程安全的,因此您需要将每个 gui 更改代码放入 SwingUtilities.invokeLater()!
如果您没有执行任何长时间的 运行 任务,每次您的计时器达到 8 秒标记时,您可能想直接使用 javax.swing.Timer。它使用 EDT 而不是它自己的 Thread,因此您不需要将对 Swing 组件的调用与 SwingUtilities.invokeLater().

同步

另见:
javax.swing.Timer vs java.util.Timer inside of a Swing application

您需要做的就是在您的 MainActivity 中声明一个长变量 timeleft

long timeleft; 

然后,当您创建一个新计时器时,设置 "onTick" 覆盖以在每个 "onTick" 更新 timeleft 变量(在以下示例中为 1000 毫秒)

        timer = new CountDownTimer(time, 1000) {
           @Override
            public void onTick(long millisecondsUntilFinished) {
                timeleft = millisecondsUntilFinished;
            }
          }

每次您需要检查剩余时间时,您的应用程序都可以访问变量 timeleft。