android 开发教程深入剖析 Android 消息机制
在 Android 中,线程内部或者线程之间进行信息交互时经常会使用消息, 这些基础的东西如
果我们熟悉其内部的原理,将会使我们容易、 更好地架构系统,避免一些低级的错误。 在学
习 Android 中消息机制之前,我们先了解与消息有关的几个类:
1.Message
消息对象,顾名思义就是记录消息信息的类。这个类有几个比较重要的字段:
a.arg1和 arg2:我们可以使用两个字段用来存放我们需要传递的整型值, 在 Service 中,我们
可以用来存放 Service 的 ID 。
b.obj :该字段是 Object 类型,我们可以让该字段传递某个多项到消息的接受者中。
c.what:这个字段可以说是消息的标志,在消息处理中,我们可以根据这个字段的不同的值
进行不同的处理,类似于我们在处理 Button 事件时,通过 switch(v.getId()) 判断是点击了哪
个按钮。
在使用 Message时,我们可以通过 new Message()创建一个 Message实例,但是 Android 更 推
荐我们通过 Message.obtain()或者 Handler.obtainMessage()获取 Message对象。这并不一定是
直接创建一个新 的实例,而是先从消息池中看有没有可用的 Message实例,存在则直接取
出并返回这个实例。反之如果消息池中没有可用的 Message 实例,则根据给定 的参数 new
一个新 Message对象。通过分析源码可得知, Android 系统默认情况下在消息池中实例化 10
个 Message对象。
2.MessageQueue
消息队列, 用来存放 Message 对象的数据结构, 按照 “先进先出 ”的原则存放消息。存放并非
实际意义的保存, 而是将 Message 对象以链表的方 式串联起来的。 MessageQueue对象不需
要我们自己创建,而是有 Looper 对象对其进行管理,一个线程最多只可以拥有一个
MessageQueue。我们可以通过 Looper.myQueue()获取当前线程中的 MessageQueue。
3.Looper
MessageQueue的管理者, 在一个线程中, 如果存在 Looper 对象, 则必定存在 MessageQueue
对象,并且只存在一个 Looper 对象和一个 MessageQueue对象。在 Android 系统中,除了主
线程有默认的 Looper 对象,其它线程默认是没有 Looper 对象。如果想让我们新创建的线程
拥有 Looper 对象时,我们首先应调用 Looper.prepare()方法,然后再调用 Looper.loop() 方法。
典型的用法如下:
view plaincopy to clipboardprint?
classLooperThreadextendsThread
{
publicHandlermHandler;
publicvoidrun()
{
Looper.prepare();
评论0