周期性变化的事件
Android中的Handler消息传递机制:子线程与主线程协同工作的桥梁
子线程通过Handler发送消息,主线程收到消息后,负责页面的更改
Android规定:所有对界面的操作只放在主线程(界面控件非线程安全)
Handler类
用于发送、接收、处理消息
-
执行过程:
子线程中,有对界面操作需求时,通过Handler发送消息
Hanlder接收消息:系统自动调用handleMessage方法(回调方法)
handleMessage方法处于主线程中
-
> 发送消息和处理消息都是同一个Handler
所以说:谁发送谁处理
开发步骤
- 继承了
Handler
类 & 创建了子类对象,重写handleMessage()方法 - 新启动的线程中,调用Handler对象的发送消息方法sendMessage(消息对象)
- 利用Handler对象的handleMessage()方法接收消息,然后根据不同消息执行不同操作
或调用Handler对象的post方法,传入新线程对象,重写run方法,指定操作UI内容
要点:一个Activity1 ⇔线程 ⇔ 1 Looper ⇔ 1 MessageQueue ⇔ n Handler(绑定handlemessage) ⇔ m Message
Message -> Handler ( 发送sendmessage ) -> MessageQueue ( 存储 ) -> Looper ( 轮询 ) -> Handler ( 执行handlemessage )
发送-接收-分发-处理
handler sendMessage-->looper轮询读取和分发-->handler的回调处理
Handler在多线程中使用(生产者消费者模型)
多-1-多模型
模块 | 线程 |
---|---|
生产者 | 子线程handler.sendmessage |
消费者 | 主线程 looper & handler.handlemessage |
中介 | 主线程 messageQueue |
小结:
- 主线程和子线程通信依靠1个全局变量messagequeue
- handler作为全局变量,负责在子线程发送,主线程处理
- looper和messagequeue绑定。使用looper 初始化handler,handler和looper绑定
- Handler和looper绑定:创建handler,构造函数要传入Looper。主线程创建handler,默认使用主线程looper,不需要显式传入.
- Handler创建和handlemessage(handler处理)在一个线程