Java 如何在每次重新运行程序时将计时器重置为从00:00:00开始?

Java 如何在每次重新运行程序时将计时器重置为从00:00:00开始?,java,android,Java,Android,我添加到maintactity.java private Button startButton; private Button pauseButton; private TextView timerValue; private long startTime = 0L; private Handler customHandler = new Handler(); long timeInMilliseconds = 0L; long timeSwapBuff = 0L; long updatedTi

我添加到maintactity.java

private Button startButton;
private Button pauseButton;
private TextView timerValue;
private long startTime = 0L;
private Handler customHandler = new Handler();
long timeInMilliseconds = 0L;
long timeSwapBuff = 0L;
long updatedTime = 0L;
然后在onCreate中,我添加了: 当我运行程序时,计时器将自动启动,无需单击“启动”按钮。我希望计时器在运行程序时正确启动

customHandler.postDelayed(updateTimerThread,0);

        timerValue = (TextView) findViewById(R.id.timerValue);

        startButton = (Button) findViewById(R.id.startButton);

        startButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                startTime = SystemClock.uptimeMillis();
                customHandler.postDelayed(updateTimerThread, 0);

            }
        });

        pauseButton = (Button) findViewById(R.id.pauseButton);

        pauseButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {

                timeSwapBuff += timeInMilliseconds;
                customHandler.removeCallbacks(updateTimerThread);

            }
        });
然后,方法updateTimerThread:

private Runnable updateTimerThread = new Runnable() {

        public void run() {

            timeInMilliseconds = 0L;//SystemClock.uptimeMillis() - startTime;
            timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
            updatedTime = timeSwapBuff + timeInMilliseconds;

            int secs = (int) (updatedTime / 1000);
            int mins = secs / 60;
            secs = secs % 60;
            int milliseconds = (int) (updatedTime % 1000);
            timerValue.setText("" + mins + ":"
                    + String.format("%02d", secs) + ":"
                    + String.format("%03d", milliseconds));
            customHandler.postDelayed(this, 0);
        }

    };
在这种方法中,我做到了:

timeInMilliseconds = 0L;
但变化不大。 我想做的是每次我从一开始就运行我的程序,计时器将从00:00:00开始

编辑 在“关于”活动中,我现在做了以下几点:

    startTime = SystemClock.uptimeMillis();
    customHandler.postDelayed(updateTimerThread,0);
    timerValue = (TextView) findViewById(R.id.timerValue);

    startButton = (Button) findViewById(R.id.startButton);

    startButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            startTime = SystemClock.uptimeMillis();
            customHandler.postDelayed(updateTimerThread, 0);

        }
    });

    pauseButton = (Button) findViewById(R.id.pauseButton);

    pauseButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {

            timeSwapBuff += timeInMilliseconds;
            customHandler.removeCallbacks(updateTimerThread);

        }
    });
在UpadteTimerRead中,我没有更改:

private Runnable updateTimerThread = new Runnable() {

        public void run() {

            timeInMilliseconds = System.currentTimeMillis() - startTime;
            updatedTime = timeSwapBuff + timeInMilliseconds;

            int secs = (int) (updatedTime / 1000);
            int mins = secs / 60;
            secs = secs % 60;
            int milliseconds = (int) (updatedTime % 1000);
            timerValue.setText("" + mins + ":"
                    + String.format("%02d", secs) + ":"
                    + String.format("%03d", milliseconds));
            customHandler.postDelayed(this, 0);
        }

    };

仍然在运行程序时,计时器不是从00:00:00开始的,但我在分钟数上看到一个很长的数字,也就是秒数,就像它继续运行一样,没有重新启动一样。在
开始按钮
onClick
方法中,您有:

startTime = SystemClock.uptimeMillis();
customHandler.postDelayed(updateTimerThread, 0);
但在顶部,您只有:

customHandler.postDelayed(updateTimerThread,0);

由于
updateTimerThread
使用
startTime
值,您很可能希望在顶部以相同的方式初始化它。

将计时器重置回零的关键在
updatedTime
变量中。这就是当您按下开始按钮时,计时器开始的位置

无需重新初始化startTime变量,因为
startTime=SystemClock.uptimeMillis()已将开始时间正确设置回0。请记住,
startTime
与计时器上当前显示的内容相关。这就是为什么计时器从您暂停的位置开始,而不会跳过计时器暂停时的秒数

在启动按钮的
onClick
事件中,将
timeSwapBuff
设置回
0L
。这会将时间缓冲区重置为0。然后将其添加回startTime(也是0),并强制计时器完全重新开始

尝试:


timeinms=0L被下一行覆盖
timeinmillises=SystemClock.uptimeMillis()-startTime对,我已经试过了,但没有第二行,但效果不好。这并不重要,而是使用而不是
SystemClock.uptimeMillis()
--好吧,这可能很重要,取决于睡眠模式应该如何处理。这并不重要,但要结合你的
格式调用:
String.format(“%d:%02d:%02d”,分、秒、毫秒)
你需要在第一次调用
postDelayed
之前设置
startTime
,我编辑了我的问题,并添加了我现在所做的。仍然在运行程序时,计时器不是从00:00:00开始的,但我在分钟数上看到一个很长的数字,就像它在继续一样,不是像重置一样重新开始。@ShimritHadadi您使用
uptimeMillis
初始化,但线程使用
currentTimeMillis
。它们不一样,或者在任何方面都不可比无关:为什么
timeinmillizes
updatetime
声明为字段,而不仅仅是局部变量?
public void onClick(View view) {
    timeSwapBuff = 0L;
    startTime = SystemClock.uptimeMillis();
    customHandler.postDelayed(updateTimerThread, 0);
}