相信不少人对这几个概念深恶痛绝,因为它们“像雾像雨又像风”——自我感觉都很熟识,如果下一次再相遇,却又陌生得很。这种“隔靴搔痒”的感觉促使我们必须与这些“顽固分子”来个彻底的决断。
先不要想太多,任头脑中随意画下对这些概念的第一印象,如图5-5所示。
▲图5 5 概念初探
图5-5是我们对这几个概念的“感官”释义,读者可以尝试着思考下是否和自己所想的基本一致。
那么,如果把这些概念糅合在一起,又会是怎样的呢?如图5-6所示。
▲图5 6 Runnable, Message, MessageQueue, Looper和Handler的关系简图
下面来解释图5-6的含义。
Runnable和Message可以被压入某个MessageQueue中,形成一个集合
注意,一般情况下某种类型的MessageQueue只允许保存相同类型的Object。图中我们只是为了叙述方便才将它们混放在同一个MessageQueue中,实际源码中需要先对Runnalbe进行相应转换。
Looper循环地去做某件事
比如在这个例子中,它不断地从MessageQueue中取出一个item,然后传给Handler进行处理,如此循环往复。假如队列为空,那么它会进入休眠。
Handler是真正“处理事情”的地方
它利用自身的处理机制,对传入的各种Object进行相应的处理并产生最终结果。
用一句话来概括它们,就是:
Looper不断获取MessageQueue中的一个Message,然后由Handler来处理。
接下来的一系列分析无论多复杂,都是基于这句话展开的,希望读者牢记。
可以看出,上面的几个对象是缺一不可的。它们各司其职,很像一台计算机中CPU的工作方式:中央处理器(Looper)不断地从内存(MessageQueue)中读取指令(Message),执行指令(Handler),最终产生结果。当然,到目前为止我们还只是从逻辑的层面理清了它们的关系,接下来将从代码的角度来验证这些假设的真实可靠性。
1.Handler
代码路径:frameworks/base/core/java/android/os/Handler.java
读者有没有注意过,Handler和线程Thread是什么关系。
public class Handler {…
final MessageQueue mQueue;
final Looper mLooper;
final Callback mCallback;
本小节中几个主要元素的类关系如图5-7所示。
从图中可以看出,Handler和Thread确实没有在表象上产生直接的联系。但是因为:
① 每个Thread只对应一个Looper;
② 每个Looper只对应一个MessageQueue;
③ 每个MessageQueue中有N个Message;
④ 每个Message中最多指定一个Handler来处理事件。
由此可以推断出,Thread和Handler是一对多的关系。
▲图5 7 Thread和Handler的关系图
Handler是应用开发人员经常会使用到的一个类。概言之,它有两个方面的作用。
处理Message,这是它作为“处理者”的本职所在。
将某个Message压入MessageQueue中。
实现第一个功能的相应函数声明如下。
publ
Handler, MessageQueue, Runnable与Looper
最新推荐文章于 2019-09-23 09:08:29 发布
本文深入解析Android中的消息处理机制,包括Handler、MessageQueue、Looper等核心组件的工作原理及相互关系,帮助开发者更好地理解和运用。

最低0.47元/天 解锁文章
3335





