Обработчик используется не только для связи с main Looper.
Looper
- это класс, который зацикливается на очереди сообщений и отправляет их, каждый экземпляр работает с одним Thread
.
A HandlerThread
- это Thread
, к которому также прикреплен Looper
.
«Основной» Thread
вашего приложения также является HandlerThread
.
Когда вы создаете экземпляр Handler
с пустым конструктором, Handler
будет присоединен к Looper
из Thread
, в котором вы создаете экземпляр.Например, если вы создаете Thread
в onCreate
из Activity
, тогда Handler
будет присоединен к основному (UI) Thread
, потому что там выполняются обратные вызовы жизненного цикла.
Когда вы вызываете post(Runnable)
, Runnable
будет запущен в потоке, к которому прикреплен Handler
Looper
.Таким образом, если вы создаете Handler
в одном из обратных вызовов жизненного цикла вашего Activity
, то независимо от того, с какого Thread
вы отправляете Runnable
, он всегда будет выполняться на главном Thread
Это наиболее распространенное использование, и это то, что делает ваш код, но это не единственный.Например, вы можете создать экземпляр HandlerThread
, затем из обратных вызовов жизненного цикла Activity
вы можете опубликовать Runnable
, который выполняет очень длинную операцию, и он не будет блокировать ваш пользовательский интерфейс, потому что он будет выполняться на другом Thread
.
Другое использование post(Runnable)
(а иногда и универсальное грязное исправление для странных ошибок пользовательского интерфейса) - вызывать его из основного потока просто с целью задержки выполнения до тех пор, пока не будет выполнен весь метод.
fun onCreate(savedInstanceState: Bundle?) {
Handler().post {
// code here is executed after `onCreate` has returned
}
// code here is executed before the one posted on the Handler
}