Чтобы вопрос стал понятнее, рассмотрим пример на скриншоте. Хэндлер создается конструктором по умолчанию, значит он привязан к луперу текущего треда. Другими словами код
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)
}
}