Handler的主要作用是收发 msg
和切线程,他的消息机制离不开Looper、MessageQueue
- 其中
Looper
每个线程只能持有一个,主要负责循环查看MessageQueue
里面是否有msg
需要处理,并将需要处理的消息取出,交给Handler
-
MessageQueue
是负责存放消息的,数据结构是一个单链表,这样就可以方便地插入或删除msg
具体流程一般是:
-
Handler
发送一条msg
=> 本质是向MessageQueue
里插入1.1一条msg
1.1插入时候的依据是msg.when
=>SystemClock.uptimeMillis() + delayMillis
- 这条
msg
被MessageQueue.next()
2.1返回并交给Handler
去处理
2.1next()
会在有同步屏障(msg.target==null
)的时候遍历查找并返回最早的异步消息,并在移除屏障后,从头取出并返回消息 -
Handler.dispatchMessage(msg)
会优先处理msg.callback
3.1,如果msg.callback
为空,就处理Handler.mCallback
3.2,然后处理是msg
本身
3.1msg.callback
是在调用Handler.post(Runnable)
时,里面的Runnable
(runOnUIThread
,view.post(Runnable)
也用的是Handler.post(Runnable)
,Runnable
是一样的)
3.2这是在不继承Handler
的情况下,另一种调用Handler
的方式
class MyHandlerCallBack: Handler.Callback {
override fun handleMessage(msg: Message?): Boolean {
TODO("Not yet implemented")
}
}