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.callback3.1,如果msg.callback为空,就处理Handler.mCallback3.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")
}
}