Android提供了handler 和looper 来满足线程之间的通信。
Handler先进先出原则。
Looper类用来 管理特定线程内对象之间的消息交换
1. looper:一个线程可以产生一个looper 对象,由它来管理此线程里的消息队列Message Queue,是消息队列和handler之间的桥梁
2. handler:可以构造handler对象与looper沟通,以便push新消息到消息队列中;或者接收looper从消息队列取出所送来的消息
3. 消息队列:用于存放线程放入的消息。
4. 线程:通常就是主线程,而android启动程序 时会建立一个消息队列。每个线程里可含有一个Looper对象以及一个MessageQueue数据结构。在应用程序里,可以定义Handler的子类别来接收Looper所送出的消息。
一.Handler创建 消息
Handler创建消息时首先查询消息池中是否有消息存在,如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。
消息池的优点:可提供下次handler创建消息时使用。提高了消息对象的复用,减少系统垃圾的次数
消息创建流程图:
二.Handler发送消息
主线程初始化第一个handler时会创建一个looper,该looper与主线程一一对应。(每个线程只创建一个looper)。然后其他 handler初始化时直接获取 第一个handler创建 的looper。而looper初始化时会创建 一个消息队列
Handler、Looper、MessageQueue的初始化流程如图
Handler有对主线程消息队列和消息循环looper的引用,子线程可以通过 handler将消息发送到主线程的消息队列中
三.Handler处理消息
主线程通过 looper循环查询消息队列,当发现有消息存在时会从消息队列中取出。通过消息的参数判断该消息对应的handler,然后将消息分发到指定的handler进行处理
子线程通过 handler,looper与主线程通信的流程