Синхронно или асинхронно выполняется Handler⁠.post(), если вызывается без изменения треда?

Посмотреть в Telegram: @AndroidSobes/87
Чтобы вопрос стал понятнее, рассмотрим пример на скриншоте. Хэндлер создается конструктором по умолчанию, значит он привязан к луперу текущего треда. Другими словами код Log.d("TAG", "2") выполняется в том же треде, что и код Log.d("TAG", "1").
Вопрос заключается в том, будет ли код, в методе post() вызван синхронно, в момент вызова post(), или будет добавлен в очередь сообщений и запущен после отработки текущего метода. В первом случае вывод в лог будет "2 1", во втором "1 2".

Ответ: объект Runnable, переданный в метод post(), добавляется в очередь сообщений в любом случае, т.е. вывод будет "1 2".

Если требуется выполнять код метода post() синхронно, в случаях когда метод вызван на том же потоке, можно написать следующую extension-функцию:

fun Handler.postOrRun(runnable: Runnable) {
if (looper.isCurrentThread) {
runnable.run()
} else {
post(runnable)
}
}