Android使用两个倒数计时器

时间:2017-01-28 10:17:42

标签: java android timer countdowntimer

在我的应用中,我使用两个具有相同值的CountDownTimers。我有两个按钮来控制它们但是当我按下按钮两次时,它从头开始。我想保留它的最后一个值。

这是我的代码:

t1 = new CountDownTimer(white, 1000) {
    @Override
    public void onTick(long l) {
        btnWhite.setText("seconds remaining: " + l / 1000);
        white = l;
    }

    @Override
    public void onFinish() {

    }
};

t2 = new CountDownTimer(black, 1000) {
    @Override
    public void onTick(long l) {
        btnBlack.setText("seconds remaining: " + l / 1000);
        black = l;
    }

    @Override
    public void onFinish() {

    }
};

btnBlack.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        t1.start();
        t2.cancel();
    }
});

btnWhite.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        t2.start();
        t1.cancel();
    }
});

2 个答案:

答案 0 :(得分:1)

我检查了你的代码。

很明显,因为你的计时器是用默认值初始化的。当你再次开始时,它不会采用白色/黑色的新值。

要实现您的目标,您必须在启动计时器之前使用新值初始化计时器。

我在你的代码中做了一些修正。你可以检查一下。

制作两种方法

public void timerStart1(long timeLengthMilli) {
    t1 = new CountDownTimer(timeLengthMilli, 1000) {
        @Override
        public void onTick(long l) {
            isRunning1 = true;
            tv1.setText("seconds remaining: " + l / 1000);
            white = l;
        }

        @Override
        public void onFinish() {
            isRunning1 = false;
        }
    }.start();
}

public void timerStart2(long timeLengthMilli) {
    t2 = new CountDownTimer(timeLengthMilli, 1000) {

        @Override
        public void onTick(long l) {
            isRunning2 = true;
            tv2.setText("seconds remaining: " + l / 1000);
            black = l;
        }

        @Override
        public void onFinish() {
            isRunning2 = false;
        }
    }.start();
}

并像这样设置setOnClickListener

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!isRunning1) {
            isRunning2 = false;
            timerStart1(white);
            if (t2 != null)
                t2.cancel();
        }
    }
});

button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!isRunning2) {
            isRunning1 = false;
            timerStart2(black);
            if (t1 != null)
                t1.cancel();
        }
    }
});

更新:

请检查更新的代码并获取这些额外的变量

boolean isRunning1 = false, isRunning2 = false;

希望这会对你有所帮助。

快乐编码。

答案 1 :(得分:1)

我测试了这个并且它有效!

我有两个TextView和两个Button。黑色按钮位于黑色文本视图旁边,白色按钮位于白色文本视图旁边。

首先,我宣布重要的常数。

//contains the elapsed time for each of the timers
long blackElapsed=0,whiteElapsed=0;

//contains the total time with which we start new timers
long totalWhite = 30000;
long totalBlack = 30000;

接下来,我初始化CountDownTimers。无论你在这里放什么都没关系。我只有这个,以便定时器初始化有一些价值。 原因是必须对它们进行初始化,以便能够在.cancel()之后OnClickListener对它们进行初始化。

black = new CountDownTimer(totalWhite, 1000){
    @Override
    public void onTick(long l) {
    }
    @Override
    public void onFinish() {
    }
};
white = new CountDownTimer(totalBlack, 1000){
    @Override
    public void onTick(long l) {
    }
    @Override
    public void onFinish() {
    }
};

最后是OnClickListener的按钮。 (W是白色textView,B是黑色textView,b是黑色按钮,w是白色按钮)

w.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        black.cancel();
        //using the elapsed time to start a new timer
        totalBlack = totalBlack - blackElapsed;
        //this preserves milliseconds by ticking every millisecond
        white = new CountDownTimer(totalBlack, 1){
            @Override
            public void onTick(long l) {
                B.setText(l+"");
                blackElapsed=totalBlack-l;  //updating the elapsed time
            }
            @Override
            public void onFinish() {
            }
        }.start();
    }
});
//we do a similar thing with the other player's button
b.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        white.cancel();
        totalWhite = totalWhite - whiteElapsed;
        black = new CountDownTimer(totalWhite, 1){
            @Override
            public void onTick(long l) {
                W.setText(l+"");
                whiteElapsed=totalWhite-l;
            }
            @Override
            public void onFinish() {
            }
        }.start();
    }
});