Как точно работает метод postDelayed(Runnable runnable, Long delayMilliSeconds)?

Я хочу знать, когда выполняется метод postDelayed(...) и есть много сообщений, ожидающих в очереди сообщений. В этом случае, когда runnable будет запущен? это будет по истечении времени, определенного в методе? или он будет ждать, пока его роль придет в очередь сообщений? или что... ?


person HiddenDroid    schedule 05.08.2015    source источник


Ответы (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 переход сообщения в начало очереди?

Надеюсь, что это поможет.

person Rodrigo Henriques    schedule 05.08.2015
comment
Но что, если прогон ожидающих сообщений занимает больше времени, чем delayMillis? - person HiddenDroid; 06.08.2015
comment
проверьте принятый ответ на этот вопрос: stackoverflow.com/questions/27240015/ - person Rodrigo Henriques; 06.08.2015
comment
Это именно то, что вы хотите знать. - person Rodrigo Henriques; 06.08.2015
comment
Спасибо, Родриго, ссылки такие полезные - person HiddenDroid; 08.08.2015