以前講了關於Handler的原理,這篇要講一講關於Handler的使用方法。java
經過下面的代碼可知,當msg.what
中的數值爲1時,發出Toast通知,內容爲msg.obj
中的字符串。 若是爲其餘,則發出另外一種Toast通知。git
// 實例化Handler
handler = object : Handler() {
// 重寫處理消息的方法
// 在這裏重寫的方法便是dispatchMessage中第二優先級的Handler的回調
// 能夠經過msg.what中的數值來判斷此消息是從何處發過來的
override fun handleMessage(msg: Message) {
when (msg.what) {
1 -> {
Toast.makeText(applicationContext, msg.obj.toString(), Toast.LENGTH_LONG)
.show()
}
else -> {
Toast.makeText(applicationContext, "others", Toast.LENGTH_LONG).show()
}
}
}
}
複製代碼
普通的消息傳遞是Handler的最基本的使用方法。經過msg.what
中數據能夠判斷出信息會從哪裏發出來的,以及能夠獲取消息中存儲的數據內容。 閒話很少說,看代碼。github
private fun handlerMessage() {
Thread(Runnable {
val message = Message.obtain()
message.what = 1
message.obj = "handler message"
// 經過這個方法,把消息存儲到MessageQueue中
handler.sendMessage(message)
}).start()
}
複製代碼
除了上面的普通消息的傳遞,還能夠傳遞一個Runnable,讓收到消息的線程執行Runnable中的代碼。app
private fun handlerRunnable() {
Thread(Runnable {
// 這裏經過post把Runnbale傳遞給Handler,
// 實際原理是post方法會建立一個Message,而且把Message的callback設爲Runnable
handler.post(Runnable {
Toast.makeText(applicationContext, "handler runnable", Toast.LENGTH_LONG).show()
})
}).start()
}
複製代碼
除了上面的實時傳遞Runnable之外還能夠延遲執行Runnable。以下面的代碼。ide
private fun handlerDelayRunnable() {
Thread(Runnable {
// Runnble裏面的代碼會被延遲2秒執行
handler.postDelayed(Runnable {
Toast.makeText(applicationContext, "handler delayRunnable", Toast.LENGTH_LONG)
.show()
}, 2000)
}).start()
}
複製代碼
固然除了實時傳遞和延遲傳遞之外還有 定時傳遞 postAtTime()
方法。具體的使用方法能夠看一下文檔,用起來很簡單。post
sendMessage
)兩次,會報錯。Message()
)來獲取,但並不推薦。推薦使用val message = Message.obtain()
來獲取。handler.removeCallbacksAndMessages(null)
。關於Android Handler原理:juejin.im/post/5e2bfd… github:github.com/HyejeanMOON…spa