Android Handler的使用

1. 簡介

以前講了關於Handler的原理,這篇要講一講關於Handler的使用方法。java

2. Handler的初始化

經過下面的代碼可知,當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()
                    }
                }
            }
        }
複製代碼

3. 普通的消息傳遞

普通的消息傳遞是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()
    }
複製代碼

4. Runnable消息的傳遞

除了上面的普通消息的傳遞,還能夠傳遞一個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

5. 注意點

  1. 同一個實例化的Message對象不要發送(sendMessage)兩次,會報錯。
  2. Message對象能夠經過直接實例化(Message())來獲取,但並不推薦。推薦使用val message = Message.obtain()來獲取。
  3. 若是在Handler中引用了Activity等有長生命週期的組件,在Activity的onDestory時不要忘了對Handler的取消,以避免數據泄漏。取消的方法是handler.removeCallbacksAndMessages(null)

關於Android Handler原理:juejin.im/post/5e2bfd… github:github.com/HyejeanMOON…spa

相關文章
相關標籤/搜索