There are two main uses for a Handler: (1) to schedule messages and runnables to be executed at some point in the future; and (2) to enqueue an action to be performed on a different thread than your own.
Useful links
Post runnable to another thread
val handler = Handler(Looper.getMainLooper())
repeat(3) {
Thread {
val message = "Message from ${Thread.currentThread()}"
handler.post {
log("${Thread.currentThread()} is precessing the $message")
}
}.start()
}
Thread[main,5,main] is precessing the Message from Thread[Thread-3,5,main]
Thread[main,5,main] is precessing the Message from Thread[Thread-4,5,main]
Thread[main,5,main] is precessing the Message from Thread[Thread-5,5,main]
Post a runnable object and send a message
val callback = object : Handler.Callback {
override fun handleMessage(msg: Message): Boolean {
log("callback handleMessage ${msg.hashCode()} ${msg.data.getString("data_key")}")
return false
}
}
val handler = object : Handler(Looper.getMainLooper(), callback) {
override fun handleMessage(msg: Message) {
log("handler handleMessage ${msg.hashCode()} ${msg.data.getString("data_key")}")
}
}
handler.post {
log("Post runnable")
}
val message = Message.obtain().apply {
this.data = Bundle().apply {
putString("data_key", "Some useful data")
}
}
handler.sendMessage(message)
Post runnable
callback handleMessage 263648415 Some useful data
handler handleMessage 263648415 Some useful data