如何制作一个执行一定时间的计时器

时间:2017-03-12 13:21:45

标签: java android timer

我正处于足球比赛计时器项目的中间。基本上,我正在寻找一个计时器的实现,该计时器在按下"START 1st half"按钮后开始,计数到45分钟,而不是暂停,我们可以再次启动它"START 2nd half"(它会是相同的按钮,但它的文本将通过整个匹配更改)。然后它会从45分钟到90分钟。

我一直在尝试使用Handler()Runnable()onClickListener()完成此操作,但它对我来说根本不起作用:(你能不能给我关于如何解决这个问题的一些建议?

Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {

@Override
public void run() {

        showTimeRemaining();
        timerHandler.postDelayed(this, 500);
    }
};
        b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Button b = (Button) v;
            startButton(v);
            if (b.getText().equals("Mecz trwa")) {    
                timerHandler.removeCallbacks(timerRunnable);            
                b.setEnabled(true);
            } else {
                startTime = System.currentTimeMillis();
                timerHandler.postDelayed(timerRunnable, 0);
                b.setText("Mecz trwa");
                b.setEnabled(false);
            }
        }
    });

    public void showTimeRemaining() {
    long millis = System.currentTimeMillis() - startTime;
    int seconds = (int) (millis / 1000);
    int minutes = seconds / 60;
    seconds = seconds % 60;


    timerTextView = (TextView) findViewById(R.id.time);
    timerTextView.setText(String.format("%d:%02d", minutes, seconds));
    }

2 个答案:

答案 0 :(得分:0)

我建议尝试使用CountDownTimer。

请参阅此处了解文档和用法:

https://developer.android.com/reference/android/os/CountDownTimer.html

答案 1 :(得分:0)

以下是我的一些建议。

首先,将您的Handler封装到名为Timer的类中。这样操作定时器就更容易了。这是我的版本:

导入android.os.Handler;

public class Timer {
    private Handler handler;
    private boolean paused;

    private int interval;

    private Runnable task = new Runnable () {
        @Override
        public void run() {
            if (!paused) {
                runnable.run ();
                Timer.this.handler.postDelayed (this, interval);
            }
        }
    };

    private Runnable runnable;

    public int getInterval() {
        return interval;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }

    public void startTimer () {
        paused = false;
        handler.postDelayed (task, interval);
    }

    public void stopTimer () {
        paused = true;
    }

    public Timer (Runnable runnable, int interval, boolean started) {
        handler = new Handler ();
        this.runnable = runnable;
        this.interval = interval;
        if (started)
            startTimer ();
    }
}

其次,请勿使用System.currenTimeMillis。使用更易操作的东西。创建一个自己的变量,用于存储剩余的秒数:

private int secondsLeft = 60 * 45;

您每秒递减此变量,直到它达到零。然后,您停止计时器,更改按钮的文本或其他任何内容。应将此逻辑放入用于处理程序的Runnable