Android消息机制

  用消息队列可以完成主线程和子线程之间的消息传递,涉及到三个类:Looper,Message,Handler,这三者之间的关系如下:

  

  从上图可以看出,Looper可视为一个MessageQueue,是一个消息的集合,而每个消息都可以通过Handler增加和取出,Handler对象可能存在于主线程(UI Thread)和子线程中。

  Message类

   android.os.Message的主要功能是进行消息的封装,Message类定义的变量和方法如下:

  

  

  Handler类

   android.os.Handler类用于处理消息。

    A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a    single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it --          from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue. 

  

  每一个Handler实例都与创建该Handler所在的线程绑定,并绑定了该线程中的消息队列(即:Looper),之后该Handler实例便会向该消息队列(Looper)中发送和处理消息。

  Handler类有两个作用:

  一、在新启动的线程中发送消息

  二、在主线程中获取、处理消息

  

  消息队列 Looper

   每个线程只能拥有一个Looper。它的loop方法负责读取MessageQueue中的消息,读到信息之后就把消息交给发送该消息的Handler进行处理。  

  在UI线程(主线程)中,系统已经初始化了一个Looper对象,因此程序直接创建Handler即可,然后就可以通过Handler来发送消息、处理消息。

  如果需要在子线程中,创建Handler用于发送、处理消息,需要在子线程中创建自己的Looper对象,并启动它。创建Looper对象,方法为: Looper.prepare()

  如果在子线程中创建自己的Handler对象,在run()方法里面,步骤如下:

  1.Looper.prepare();

  2.创建Handler实例,并重写其handleMessage()方法;

  3.Looper.loop();

  总结:不同线程间通信,比如线程A要向线程B发送信息,是调用线程B中的Handler对象实例发送信息,然后在线程B中的handleMessage()方法里进行消息处理。

原文地址:https://www.cnblogs.com/xingkai/p/5106063.html