Что на самом деле означает параметр delayMillis в методе Handler.postDelayed()?

В документации для Handler.postDelayed(Runnable r, long delayMillis) говорится:

Вызывает добавление Runnable r в очередь сообщений для запуска по истечении указанного времени.

r Runnable, который будет выполнен. delayMillis Задержка (в миллисекундах) до выполнения Runnable.

ПРИМЕЧАНИЕ. Последнее слово Выполнено и не Добавлено в очередь сообщений. Runnable мгновенно добавляется в конец очереди сообщений. Это означает, что задержка выполнения этого Runnable будет равна времени, затрачиваемому на выполнение сообщений/runnables перед этим Runnable в очереди сообщений. Как гарантируется, что оба времени равны? Я что-то упускаю?

Например, предположим, что MessageQueue в настоящее время содержит A, B, C, что занимает 1, 1,6 и 2 секунды соответственно, а handler.postDelayed(R, 4000) теперь добавляет R в конец MessageQueue. A, B, C будут завершены за 4,6 секунды, но запуск R запланирован через 4 секунды. Как это возможно? Что делать, если задержка составила более 4,6 секунды?

URL – справочная страница Android для Сообщение обработчика задержано


person Ashok Bijoy Debnath    schedule 29.08.2014    source источник
comment
В основном он будет запущен как минимум через delayMillis миллисекунды.   -  person Simas    schedule 30.08.2014


Ответы (1)


Это не точная задержка. Думайте о задержке как «не ранее чем». После задержки runnable имеет право на выполнение, но он запускается только тогда, когда очередь сообщений обработала все предыдущие сообщения.

Мораль: убедитесь, что вы обрабатываете свои сообщения/runnables, не блокируя поток в течение длительного времени.

person laalto    schedule 29.08.2014