Как перебрать класс таймера для отложенного времени? - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу запустить таймер примерно на 30000 мс и до 8 или более раз каждый, так что вот мой цикл, но он запускает все таймеры сразу после 30000 мс

    public void repeatTimerTask() {
    repeat = 8; // need to run 30 sec timer for 8 times but one after one

    startTimer(30000); // firsat timer for 30 sec

    Handler handler = new Handler();
    for (int a = 1; a<=repeat; a++) {

        final int finalA = a;
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                startTimer(30000);

            }

        }, 30000); // delay until to finish first timer for 30 sec
    }
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Пожалуйста, попробуйте приведенный ниже код и вызовите метод startTimer, где вы сначала хотите запустить таймер:

private int startTimerCount = 1, repeat = 8;

private void startTimer(){
    // if startTimerCount is less than 8 than the handle will be created
    if(startTimerCount <= repeat){
        // this will create a handler which invokes startTimer method after 30 seconds
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startTimer();
            }
        }, 30000);

        // do what you want
        Toast.makeText(this, "startTimer " + startTimerCount, Toast.LENGTH_SHORT).show();
    }
    startTimerCount++;
}
0 голосов
/ 10 ноября 2018

Чтобы запустить таймер на n секунд, вы можете использовать CountDownTimer

Объявите два глобальных вариабеля. Один на количество раз, которое вы хотите повторить. и один, чтобы вести подсчет повторений.

 private int NUM_REPEAT = 4;
 private int REPEAT_COUNT = 0;

Тогда вызывайте этот метод, куда хотите. Стоит отметить, что если вы хотите запустить этот цикл 5 раз, вам нужно указать количество повторений 4. Для того, чтобы выполнить эту функцию, вы должны вызывать ее, чтобы она не учитывалась.

private void startTimer() {

    new CountDownTimer(3000, 1000) {
        int secondsLeft = 0;

        public void onTick(long ms) {
            if (Math.round((float) ms / 1000.0f) != secondsLeft) {
                secondsLeft = Math.round((float) ms / 1000.0f);
                // resend_timer is a textview
                 resend_timer.setText("remaining time is "+secondsLeft);
                ;
            }
        }

        public void onFinish() {
            Log.d(TAG, "timer finished "+REPEAT_COUNT);
            if (REPEAT_COUNT <= NUM_REPEAT) {
                startTimer();
                REPEAT_COUNT++;
            }

        }
    }.start();
}
...