Эта строка
new CountDownTimer(3000, 1000)
создает таймер обратного отсчета, который запускает onTick
по истечении 1 секунды, по истечении 2 секунд и, возможно, по истечении 3 секунд (не актуально, но стоит проверить).
На каждом из вызовов onTick
(2 или 3 вызова) вы создаете новый обработчик и назначаете его:
handler = new Handler();
и post
it. Каждый раз, когда завершается каждый обработчик (сейчас 2 или 3 обработчика), они перепланируются на 100 миллисекунд спустя:
handler.postDelayed(runnable, 100);
Обратите внимание, что запускаемый экземпляр также воссоздается, что не нужно.
Когда onFinish
вызывается (после 2 или 3 тактов) - 2 или 3 обработчика работают и повторяются каждые 100 миллисекунд.
Только последний обработчик или (2-й или 3-й) отменяется onFinish
и начальным Обработчики 1 или 2 продолжают работать.
Изображение ...
![enter image description here](https://i.stack.imgur.com/ubBt5.png)
Вам определенно не нужно больше одного обработчика и запускаемый экземпляр - фактически, вам вообще не нужен обработчик, поскольку CountDownTimer
по сути уже делает это. Используете ли вы CountDownTimer
или просто Handler
со счетчиком, зависит от вас.
Если вы хотите, чтобы лицо в кости (показанное значение) менялось каждые 100 миллисекунд в течение 3 секунд после задержки в 1 секунду, затем измените onTick
, чтобы запускать обработчик только один раз (или вообще удалите обработчик - см. предлагаемый код). (Обратите внимание, что в настоящее время реализация начинает менять кости после начальной 1 секунды.)
(Вероятно, вам необходимо указать в сообщении, что вы действительно хотите, чтобы произошло.)
Ссылочная библиотека неправильно реализована.
Я бы предложил более простой подход, который устраняет избыточность кода CountDownTimer:
public void rollDice(View view) {
diceStatus.setText("Rolling...");
// Note the random is only created once.
final Random ranNumber = new Random();
rollButton.setEnabled(false);
// updates every 100 millis after an initial 100milli delay.
rollTimer = new CountDownTimer(3000, 100) {
@Override
public void onTick(final long millisUntilFinished) {
diceNumber = ranNumber.nextInt(6) + 1;
// use same switch statement as original post - sets the dice face.
}
@Override
public void onFinish() {
rollButton.setEnabled(true);
showDiceNumber();
}
}.start();
}
И если вам действительно нужен начальный 1 -секундная задержка перед броском, затем не start()
сразу, а добавьте что-то вроде:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
rollTimer.start();
}
}, 1000);