Я хочу знать, когда выполняется метод postDelayed(...) и есть много сообщений, ожидающих в очереди сообщений. В этом случае, когда runnable будет запущен? это будет по истечении времени, определенного в методе? или он будет ждать, пока его роль придет в очередь сообщений? или что... ?
Как точно работает метод postDelayed(Runnable runnable, Long delayMilliSeconds)?
Ответы (1)
Давайте проверим исходный код и документацию:
Вызывает добавление Runnable r в очередь сообщений для запуска по истечении указанного времени. Runnable будет запущен в потоке, к которому прикреплен этот обработчик. Временная база — это uptimeMillis(). Время, проведенное в глубоком сне, добавит дополнительную задержку к выполнению.
public final boolean postDelayed(Runnable r, long delayMillis) {
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
Теперь давайте проверим sendMessageDelayed
:
Поместить сообщение в очередь сообщений после всех ожидающих сообщений до этого (текущее время + delayMillis).
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
Итак, postDelayed добавляет вашу задачу для выполнения после всех ожидающих сообщений, но до времени безотказной работы + задержку, которую вы поставили.
Проверьте этот вопрос для получения дополнительных объяснений: Вызывает ли postDelayed переход сообщения в начало очереди?
Надеюсь, что это поможет.