在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系

Message,信息的载体,用来传递数据给Handler。

Handler (Handler处理者,是 Message 的主要处理者,负责 Message 的发送,Message 内容的执行处理)
发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的 MessageQueue 相关联。
Handler和创建它的线程绑定在一起,把 Message和Runable 对象传递给 MessageQueue,这些对象离开 MessageQueue 时,Handler 负责执行他们。

Handler有两个主要的用途:
(1)确定在将来的某个时间点执行一个或者一些 Message和Runnable 对象。
(2)在其他线程(不是 Handler 绑定线程)中排入一些要执行的动作。

post(Runnable):Runnable 在 handler 绑定的线程上执行,也就是说不创建新线程。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):

sendMessage这个动作把 Message对象排成队列,这些 Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.
handlerMessage(Message)必须由 Handler 的子类来重写。

post 这个动作把 Runnable 对象排入 MessageQueue,MessageQueue 收到这些消息的时候以一定的排序执行他们

当 posting 或者 sending 到一个 Hanler 时,你可以有三种行为: 当 MessageQueue 准备好就处理,定义一个延迟时间,定义一个精确的时间去处理。后两者允许你实现 timeout,tick,和基于时间的行为。

创建一个新进程时,主线程自带一个MessageQueue,它管理顶层的应用对象和主线程创建的窗体。

MessageQueue:(Message Queue 消息队列,用来存放通过 Handler 发布的消息,按照先进先出执行。)
包含message列表的底层类,Looper负责分发这些message。message并不是直接加到MessageQueue中,而是通过MessageQueue.IdleHandler 关联到 Looper
可以通过 Looper.myQueue()从当前线程中获取 MessageQueue

每个 message queue 都会有一个对应的 Handler。Handler 会向 messagequeue 通过
两种方法发送消息:sendMessage 或 post。这两种消息都会插在 message queue 队尾并
按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过 sendMessage
发送的是一个 message 对象,会被 Handler 的 handleMessage()函数处理;而通过 post 方
法发送的是一个 runnable 对象,则会自己执行。

Looper:
Looper 类被用来执行一个线程中的 message循环。 在线程中调用 prepare()创建一个 Looper, 然后用 loop()来处理 messages, 直到循环终止。
(Looper 是 Handler 和消息队列之间通讯桥梁,程序组件首先通过 Handler 把消息传递给
Looper,Looper 把消息放入队列,它也可以取得MessageQueue里的消息,产生消息队列,传递给Handler)
大多数和 message loop 的交互是通过Handler。

下面是一个典型的带有 Looper 的线程实现。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}

时间: 2024-10-19 22:35:54

在单线程模型中 Message、Handler、Message Queue、Looper 之间的关系的相关文章

Message、Handler、Message Queue、Looper 之间的关系

单线程模型中Message.Handler.Message Queue.Looper之间的关系 1.Message Message即为消息,可以理解为线程间交流的信息.处理数据后台线程需要更新UI,你可以发送Message内含一些数据给UI线程. 2.Handler Handler 即为处理者,是Message的主要处理者,负责Message的发送,Message内容的执行处理. 后台线程就是通过传进来的Handler对象引用来sendMessage(Message).而使用Handler,需要

Android进阶笔记08:Android 中Activity、Window和View之间的关系

1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutInflater像剪刀,Xml配置像窗花图纸.  2. 详解:       Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,并提供用户处理事件的API,如onKeyEvent, onTouchEvent等. 并维护应用程序的生命周期.Activity本身是个庞大的载体,

单线程模型中Message、Handler、MessageQueue、Looper之间的关系

Handler简介: 一个Handler允许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联.每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联.当你创建一个新的Handler时,它就和创建它的线程绑定在一起了.这里,线程我们也可以理解为线程的MessageQueue.从这一点上来看,Handler把Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler

Android面试题 请解释下单线程模型中Message、Handler、MessageQueue、Looper之间的关系

简单的说,Handler获取当前线程中的looper对象,looper用来存放从MessageQueue中取出的Message,再由Handler进行Message分发和处理,按照先进先出执行. MessageQueue(消息队列):用来存放通过Handler发送的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列. Handler:是Message的主要处理者,负责Message的发送,Message内容的执行处理.例如将消息发送到消息队列(se

深入源码解析Android中的Handler,Message,MessageQueue,Looper

本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文< Android中Handler的使用>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功能.但

python中,ascii,unicode,utf8,gbk之间的关系梳理

在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人们使用了ascii编码的方式来编码. ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 -

js中prototype,__proto__,constructor之间的关系

首先,我们需要了解三点: 1. 只要创建一个任意新函数,就会根据一个prototype属性,该属性指向函数的原型对象: 2. 每一个原型对象都会自动获得一个constructor属性,该属性只想prototype所在函数的指针: 3. 当调用构造函数创建实例时,该实例内部将包含一个指向构造函数原型对象的指针,在大部分浏览器中用__proto__标识: 从上面这三点我们可以了解到: 正常情况下:prototype属性 -> 原型对象 原型对象的constructor属性 -> 构造函数(即拥有p

Zstack中任务,事件,消息之间的关系

Zstack是Zigbee协议的具体实现,在实现的过程中为了能够更好的对各个模块和功能进行管理,所以加入了OSAL(Operating System Abstraction Layer 操作系统抽象层)(以上为个人见解). 在OSAL中,提出了任务,事件,消息三个概念.它们之间的关系如下: 任务是处理事件的一个功能集合,一般由一个事件处理函数实现(ProcessEvents) 事件是当前系统中被触发的动作,例如有按键按下,接收到其他节点发送过来的消息等等 消息则是事件编号和其对应事件内容的集合,

Java中接口与接口和类之间的关系

接口和接口之间的关系 继承关系 可以多继承,并且可以多层继承 注意: 1.如果多个父接口中有同名的抽象方法,那么子接口只需要实现一次即可 2.如果多个父接口中有同名的默认方法,那么子接口必须重写默认方法,必须要加default关键字3.如果多个父接口中有同名的静态方法,那么无须理会,因为静态方法只能供接口使用 4.如果多个父接口中有同名的私有方法,那么无须理会,因为私有方法只能本接口使用 接口和类之间的关系 实现关系 单实现: 一个类只实现一个接口 多实现: 一个类可以同时实现多个接口 格式: