Приостановите al oop с методами CountDownTimer, пока методы не будут завершены - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь создать приложение, которое имитирует трафик c, зацикливая сегмент кода, который переключает фон TextView с красного на желтый и зеленый после удержания каждого цвета в течение определенного промежутка времени. Пользователь сможет запустить и завершить l oop, нажав кнопку. Я использовал CountDownTimers, чтобы удерживать каждый фон TextView в течение определенного промежутка времени, и этот метод работает нормально. Текущее состояние моего кода выглядит следующим образом:

    public void trafficLight() {
        lightDisplay.setBackgroundColor(Color.RED);

        // Temporary for loop, a do-while loop causes the app to crash
        for (int x = 2; x <= 4; x++) {
             signalSwitcher(3000, Color.YELLOW);
             signalSwitcher(6000, Color.GREEN);
             signalSwitcher(9000, Color.RED);
        }
    }


    public void signalSwitcher(long delayTime, final int signalColor) {
        new CountDownTimer(delayTime, 1000) {

            @Override
            public void onTick(long millisUntilFinished) {
            }

            @Override
            public void onFinish() {
                lightDisplay.setBackgroundColor(signalColor);
            }

        }.start();

Кажется, я не могу получить код в методе trafficLight равным l oop, поскольку я не нашел способа приостановить запуск другой итерации l oop до завершения цикла смены фона. Другими словами, когда я запускаю код, l oop продолжает планировать задачи в CountDownTimers; оно не запланировано, дождитесь завершения задач и повторите.

Моя лучшая попытка решить эту проблему состояла в том, чтобы сделать еще один do-while l oop в конце методов signalSwitcher, которые проверяет параметр до тех пор, пока последний метод signalSwitcher не предоставит вход, необходимый для выхода из этого l oop. Тем не менее, кажется, что этот метод не работает, так как я получаю пустой экран при попытке запустить приложение.

Проще говоря, как вы можете приостановить oop, пока не будет выполнен код в CountDownTimers?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вместо l oop внесите изменения в метод CountDownTimer onTick (). Попробуйте с этим кодом.

public void trafficLight() {
    lightDisplay.setBackgroundColor(Color.RED);        
    signalSwitcher(9000);
}


public void signalSwitcher(long delayTime) {
    new CountDownTimer(delayTime, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {
    if(millisUntilFinished == 3000)
        lightDisplay.setBackgroundColor(Color.YELLOW);
    else if(millisUntilFinished == 6000)
        lightDisplay.setBackgroundColor(Color.GREEN);

        }

        @Override
        public void onFinish() {
           lightDisplay.setBackgroundColor(Color.RED);
        }

    }.start();
0 голосов
/ 15 января 2020

Я думаю, что нет прямого API может приостановить и возобновить таймер. Но вы можете просто отменить его, а затем записать оставшееся время. Пересоздайте таймер с оставшимся временем.

...