Handler消息传递机制
1、Handler类方法:
handleMessage(Message msg):处理消息的方法,该方法通常被重写
HasMessage(int what):检查消息队列重是否包含what属性为指定值的消息
HasMessage(int what,Object):检查消息队列重是否包含what属性为指定值且object属性为制定对象的消息
多个重载的Message obtainMessage()获取消息
sendEmptyMessage(int what): 发送空消息
sendEmptyMessageDelayed(int what,long delayMillis): 指定多少毫秒之后发送空消息。
sendMessage(int what,long delayMillis): 立即发送消息。
sendMessageDelayed(int what,long delayMillis): 指定多少毫秒之后发送消息。
可借助上面的这些方法,方便地利用Handler来进行消息传递。
2、工作原理
Message:Handler接收和处理消息对象;
Looper:每个线程只能拥有一个Looper,它的loop()方法负责读取MessageQueue中的消息,读到消息之后就把消息交给Handler进行处理。
MessageQueue:消息队列,它采用先进先出的方式。程序创建Looper对象时,会在它的构造里面创建MessageQueue对象。即:Looper和MessageQueue是唯一且关联的。
Handler:使用Handler发送消息,由Handler发送的消息必须被送到指定的MessageQueue,也就是说,如果希望Handler正常工作,必须在当前的线程中有一个MessageQueue,否则消息就没法保存。
不过MessageQueue是由Looper负责管理,也就是说,如果希望Handler正常工作,必须在当前线程中有一个Looper对象。为了保证当前线程中又Looper对象,可以分为2个情况讨论:
(1)在主Ui线程,系统已经初始化了一个Looper对象。因此程序可以直接创建Handler即可,然后就可以通过Handler来发送、处理消息。
(2)程序员自己启动一个子线程,必须自己创建一个Looper对应,并启动它。创建Looper对应调用prepare()方法。、
3、总结下
(1)Looper:每一个线程只有一个Looper,负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理。
(2)MessageQueue:由Looper负责管理。
(3)Handler:它能把消息送到Looper管理的MessageQueue,并负责处理Looper分为它的消息。
4、针对在子线程中使用Handler的步骤:
(1)调用Looper的prepare()方法为当前的线程创建Looper对象,创建Looper对象时,它的构造器会创建创建与之搭配的MessageQueue
(2)有了Looper之后,创建Handler的实例,重写handleMessage()方法,该方法负责处理来自其他线程的消息。
(3)调用Looper的loop()方法启动looper。
Handler+Message异步消息处理机制_冰之沁泠的博客-CSDN博客