2014-09-03 2 views
0

Хорошо, таким образом у меня довольно странная проблема: У меня есть один метод, призывающую последовательность запаздывающих методов, например:Как подключить таймеры?

btn1.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      flash(true, 3000); 
      flash(false, 1200); 
     } 
}); 

И функция вспышки идет:

private void flash(final boolean color, int duration) { 

    // SLEEP duration MILLISECONDS HERE ... 

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     public void run() { 
      changeColour(color); 
     } 
    }, duration); 
} 

Что происходит что таймер 1200 мс стартует до таймера 3000 мс, хотя сначала должен пройти 3 секунды. Я попытался добавить триггер для таймеров но замораживает только все приложения:

... 
public void onClick(View view) { 
    flash(true, 3000); 
    while(wait); //stop here until the timer triggers wait to false 
    wait = false; 
    flash(false, 1200); 
} 
... 
public void run() { 
    changeColour(color); 
    wait=false; 
} 
... 

Любая помощь приветствуется, спасибо.

ответ

0

Случается, что таймер 1200 мс стартует до таймера 3000 мс , хотя сначала должен пройти 3 секунды.

Первый должен срабатывать первым, только если вы установили точный интервал времени для обоих из них. Однако сейчас вы просто запускаете две вспышки, один из которых запускается через 3 секунды и один через 1,5 секунды (с текущего времени).

Для того, чтобы сделать то, что вы хотите, вы должны принять во внимание время первого триггера при проводке второе сообщение:

flash(true, 3000); // post a message after 3 seconds 
flash(false, 4200); // post a message after 4,2 seconds(so at 1,2 seconds after the first flash runs) 
+0

Спасибо, это, кажется, последним средством: мое беспокойство, что укладка , скажем, сто таймеров в очереди не будет работать, потому что добавление в очередь занимает некоторое время - это может дополнительно задержать таймеры для низких значений, таких как 50 мс. – Sincress

+0

@Sincress Некоторые смещения произойдут, но вызов 'flash()' в цикле с разными возрастающими интервалами времени не должен зависеть от видимой задержки. – Luksprog

+0

На самом деле это сработало просто отлично, спасибо вам, сэр! – Sincress

Смежные вопросы