【Android】の基础——消息处理机制

来源:互联网 发布:小米网络机顶盒哪个好 编辑:程序博客网 时间:2024/06/06 16:59

这次主要谈谈以Handler、MessageQueue和Looper为核心的消息处理机制。

故事

话说:一家公司,里面有很多个办公室分别负责处理不同的业务,每个办公室都有一个工作簿,每次有新的业务需要处理,提出申请的部门就会把需要处理的业务告诉负责该业务办公室的干事,这个干事就把需要处理的业务写到了工作簿上面。每个办公室都有一个办公室主任,他的职责就是不断的浏览工作簿,然后按照顺序分配,当他浏览到这条任务的时候,就把他分配给刚才写下任务的那个干事去完成。

这样就构成了我们的消息处理机制。一个公司——相当于APP,它里面会有很多的办公室——相当于线程,去传送业务的干事以及去执行任务的干事——都相当于Handler,办公室主任则——相当于Looper,办公室里面的工作簿——相当于MessageQueue。

详细

这里写图片描述
Handler通过post和send(最终是通过send)的一系列方法累发送消息。最终会使被插入消息的MessageQueue调用enqueueMessage()方法,来插入这条消息(MessageQueue使用单链表存储消息)。

Looper:在线程中,通过Looper.prepare()来创建Looper,通过Looper.loop()开始消息循环。他通过MessageQueue的next()方法来获得消息。如果next()方法没有返回,则阻塞等待;如果next()方法返回值为null则退出这个死循环。

当Looper从消息队列得到了Message,就会调用之前将这条Message插入队列的Handler的dispatchMessage()来进行处理。

Handler的dispatchMessage():

  1. 检查Message的callback是否为null:
    1. 不为null:调用handleCallback(msg),结束
    2. 为null: 检查mCallback是否为null:
      1. 为null:handleMessage(),结束
      2. 不为null:执行mCallback的handleMessage()
        1. 如果返回true:结束
        2. 如果返回false:handleMessage(),结束
1 0