【消息通信】Android消息驱动机制

来源:互联网 发布:飞跃 推荐 知乎 编辑:程序博客网 时间:2024/05/23 20:13

消息驱动机制

  Android扩展了线程的退出机制,在启动线程时,可以首先在线程内部创建一个消息队列,然后让线程进入一个无限循环中,在这个无限循环中,线程会不断检查消息队列中是否有消息。如果需要线程执行某个任务,便向线程的消息队列中发送对应任务的消息,线程在无限循环中检查到消息队列中有消息到来,便会获取该消息,进而执行该消息对应的处理流程。如果线程的消息队列中没有消息,线程便进入等待状态,等待消息的到来。通过消息控制线程的执行。

  涉及的概念:

  1.消息:用于表示一个可执行任务。通常在消息内部会封装消息的标识、执行时间、数据等。

  2.消息队列:消息创建完毕后,通过消息处理器将其发送到线程的消息队列中,消息队列维护当前可执行消息的列表。

  3.消息循环:当前线程进入消息循环中遍历消息队列获取消息,然后根据消息标识通知消息处理器及执行对应的函数。

  4.消息处理器


Looper线程

     为了实现消息驱动机制,Android基于Java标准线程模型开发了Looper线程。

     Looper线程与标准线程的区别:

     1.Looper线程的run方法执行后并不会立即退出,而是进入一个loop消息循环中等待消息的到来,然后根据消息类型分别作出不同的处理,好处是避免了频繁创建/销毁线程所带来的开销。

    

class LooperThread extends Thread{    public Handler mHandler;    public void run(){        Looper.prepare();        mHandler = new Handler(){             public void handleMessage(Message msg){}    }}    Looper.loop();}

Handler:handler是Lopper线程的消息处理器,创建并初始化Handler是Looper线程运行过程中的关键步骤之一。Hnadler承担了消息驱动机制的发送消息和处理消息两部分工作。

在Handler对象的创建中,其所作的工作是将之前在本线程中创建的Looper和MessageQueue关联到其成员变量中,这样,Lopper、MessageQueue和Handler就连接到一起了。其中Handler的成员变量mMessenger用于跨进程发送消息。//TODO(Handler的代码)

通过Handler post和send方法发送的消息,最终会存入MessageQueue内部的消息队列mMessage中,mMessage是Message类型的对象,其内部的next成员变量引用了下一条Message。Message在消息队列中是按照执行时间(when)排列的,因此消息入列前有两大类的处理情况:1.立即处理的;2.新加入消息的处理时间要晚于消息队列头部消息的处理时间,需要遍历消息队列,找到新消息的插入位置。

Message:消息的载体。





0 1
原创粉丝点击