概述
Looper是消费者,Handler是生产者,MessageQueue是消息队列,队列的实现方式是链表,Message是链表的一个节点。
线程Thread的线程变量ThreadLocal中,存放着这个线程的Looper;
Looper在初始化时,会新建一个消息队列MessageQueue,之后Looper进入一个死循环,等待从消息队列MessageQueue取得消息Message(Looper是消费者),没有消息时会阻塞;
我们程序中的Handler,会通过sendMessage或post方法,往MessageQueue中添加消息时,添加的这个Message,会记录他是属于哪个Handler发出的,同时根据message.when,决定新添加的这个Message在Queue中的位置,MessageQueue中只有一个当前的Message,队列关系是通过Message中的prev,next维护的,Message是一个链表的节点;
添加消息后,消费者Looper取得Message,并调用建立Message的Hander的dispatchMessage方法。
一个在新线程中使用handler例子,我们来分析下源码
new Thread(new Runnable() {
@Override public void run() {
Handler handler;
//1、初始化Looper
Looper.prepare();
//2、绑定handler到CustomThread实例的Looper对象、定义处理消息的方法
handler= new Handler() {
@Override public void handleMessage(Message msg) {
}
};
// 3、发送消息
handler.sendMessage(new Message());
handler.post(new Runnable())
handler.obtainMessage(1, "hello").sendToTarget();
//4、启动消息循环
Looper.loop();
}
}).start();
1
public static final void prepare() {
if (sThreadLocal.get() != null) { // 每个线程,只能有一个Looper对象
throw new RuntimeException("Only one Looper may be created per thread");
}
// 如果当前线程没有Looper,新建一个,构造函数是private的
sThreadLocal.set(new Looper());
}
private Looper() {
mQueue = new MessageQueue(); // 建立消息队列
mRun = true;
mThread = Thread.currentThread();
}
2
public Handler(){
mLooper = Looper.myLooper(); // 取得当前线程的Looper,如果抛异常
if (mLooper == null) {
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue; // 取得消息队列
mCallback = null;
}
3
//不管调用哪个方法,最终执行的是
public boolean sendMessageAtTime(Message msg, long uptimeMillis){
boolean sent = false;
// 取得消息队列
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this; // 消息发出着是自己
sent = queue.enqueueMessage(msg, uptimeMillis); // 添加到消息队列中
}
else {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}
final boolean enqueueMessage(Message msg, long when) {
if (msg.when != 0) {
throw new AndroidRuntimeException(msg
+ " This message is already in use.");
}
if (msg.target == null && !mQuitAllowed) {
throw new RuntimeException("Main thread not allowed to quit");
}
synchronized (this) {
if (mQuiting) {
RuntimeException e = new RuntimeException(
msg.target + " sending message to a Handler on a dead thread");
Log.w("MessageQueue", e.getMessage(), e);
return false;
} else if (msg.target == null) {
mQuiting = true;
}
msg.when = when;
Message p = mMessages;
// 之前没有其他消息了,MessageQueue中当前消息mMessages 就是传递进来的msg
if (p == null || when == 0 || when < p.when) {
msg.next = p;
mMessages = msg;
this.notify(); // 唤醒
} else {
// 之前有其他消息了,将传递的msg放到适合的位置,根据when
Message prev = null;
while (p != null && p.when <= when) {
prev = p;
p = p.next;
}
msg.next = prev.next;
prev.next = msg;
this.notify(); // 唤醒
}
}
return true;
}
4
public static final void loop() {
Looper me = myLooper();
MessageQueue queue = me.mQueue;
while (true) { // 死循环
Message msg = queue.next(); // 当队列中没有消息时会阻塞
if (msg != null) {
if (msg.target == null) { // 消息没有发送者时,退出消息循环
// No target is a magic identifier for the quit message.
return;
}
if (me.mLogging!= null) me.mLogging.println(
">>>>> Dispatching to " + msg.target + " "
+ msg.callback + ": " + msg.what
);
// 调用消息发出者的dispatchMessage,这里msg.target是我们sendMessage的handler
msg.target.dispatchMessage(msg);
if (me.mLogging!= null) me.mLogging.println(
"<<<<< Finished to " + msg.target + " "
+ msg.callback);
msg.recycle();
}
}
}
final Message next() {
boolean tryIdle = true;
while (true) {
synchronized (this) {
// 没有消息的或,会阻塞
try {
if (mMessages != null) {
if (mMessages.when-now > 0) {
Binder.flushPendingCommands();
this.wait(mMessages.when-now);
}
} else {
Binder.flushPendingCommands();
this.wait();
}
}
catch (InterruptedException e) {
}
}
}
}
总结
Handler作用:
1. 执行计划任务
2. 线程间通信
一个handler,只能接收到自己发出的message。handler实例与消息Message处理是关联的,发送和接受要匹配
Handler操作队列,主要是在子线程操作主线程的消息队列
Handler是实现异步的一种方式,用法是在主线程中建立Handler,(主线程中的Handler不用掉Looper.prepare);
在子线程(耗时操作)任务完成后sendMessage,这个Message会发送到主线程的消息队列中,主线程Handler的重写dispatchMessage方法,做新线程任务完成后的事情,大部分是更新UI。
- 大小: 14 KB
分享到:
相关推荐
在Android系统中,Handler、Looper和MessageQueue是实现线程间通信的核心组件,它们共同构建了一个消息处理机制。本文将深入解析这三者的源码,帮助你理解它们的工作原理,并教你如何手写一套自己的Handler系统。 ...
这个机制主要由三个关键组件构成:Handler、Message和Looper。本学习源码着重关注的是Handler和Looper的交互过程,以及它们如何协同工作来处理应用程序中的消息。下面将详细阐述这些概念。 1. **Handler**:Handler...
在Android系统中,线程(Thread)、Looper、Handler、Message以及MessageQueue和MessagePool是实现异步消息处理机制的关键组件,它们共同构建了一个高效的事件驱动模型。这些组件的关系紧密,协同工作,使得Android...
了Looper, Handler, Message这几个类的源码, 结果又一次被googler的设计震撼了, 特与大家分享。 android的消息处理有三个核心类: Looper,Handler和Message。 其实还有一个Message Queue(消息队列) , 但是MQ...
在"应用源码之HandlerLooper1.zip"这个压缩包中,我们可以深入理解这些概念以及它们在实际应用中的运作方式。 首先,`Handler`是Android中处理消息和执行任务的对象。它通常在主线程(UI线程)中创建,并关联了一个...
本压缩包"Android应用源码之HandlerLooper2_Android.zip"可能包含了关于这个主题的详细示例代码,让我们深入探讨这些关键组件的工作原理。 首先,`Handler`类是Android中处理消息和调度任务的核心组件。它允许...
本资料“Android应用源码之HandlerLooper1.zip”应该是包含了一个关于这些组件的详细示例或分析,让我们来深入探讨它们的工作原理。 首先,`Handler`是Android中的一个类,它用于在UI线程中发送和处理消息。当你...
这个压缩包“安卓Android源码——HandlerLooper2.rar”可能包含了关于这些组件的深入分析和示例代码。以下是关于`Handler`、`Looper`和`MessageQueue`的详细解释: 1. **Handler**: - `Handler`是Android中的一个...
本资料"应用源码之HandlerLooper2.zip"显然是针对这一主题进行深入解析的源码学习资源。以下是关于`Handler`、`Looper`和`MessageQueue`的详细知识讲解。 1. **Handler(处理器)**: `Handler`是Android中的一个...
综上所述,`Android应用源码之HandlerLooper2.zip`中的示例可能展示了如何有效地使用`Handler`、`Looper`和`MessageQueue`来管理线程通信和异步任务。通过分析和学习这个示例代码,开发者可以更深入地理解Android...
这个压缩包“Android应用源码之HandlerLooper1_Android.zip”可能包含了一个示例项目,详细展示了如何在Android应用程序中使用这些组件。 首先,我们来深入理解`Handler`。`Handler`是Android中的一个关键类,主要...
这个`HandlerLooper1.rar`文件可能包含了对这些概念的深入解析和示例代码。 首先,我们来详细讲解`Handler`。`Handler`是Android中的一个类,它允许开发者在不同的线程中发送和处理消息。通常,我们在主线程(UI...
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理. 简单定义: 1、Message Queue(消息队列): 用来存放通过Handler发布的消息,通常...
在Android系统中,消息处理机制是应用程序中线程间通信的一种关键方式,它涉及到Handler、Message和Looper等组件。本文将深入探讨“消息循环”Looper及其源码解析,帮助开发者更好地理解和应用这一机制。 首先,...
理解Handler、Looper和Message的源码对于开发高效、稳定的Android应用至关重要。通过深入学习这些核心组件,开发者能够更好地处理多线程间的通信,避免ANR,提高应用程序的响应速度和用户体验。在实际编程中,可以...
Android Handler Message源码解析和手写实现
总结来说,`Android应用源码之HandlerMessage1_HandlerMessage.zip`中的内容可能展示了如何利用`Handler`、`Message`和`Looper`进行多线程间的通信,以确保UI线程的流畅运行。理解和掌握这一机制对于Android开发者来...
【Android异步消息处理机制】深入理解Looper、Handler、Message三者关系 在Android系统中,异步消息处理机制是实现线程间通信和保证UI线程安全的关键组件。它涉及到了三个核心类:Looper、Handler和Message。这篇...
源码分析方面,Handler的`sendMessage()`方法最终会将Message插入到Looper的消息队列。这个队列是一个基于数组的双端队列(ArrayDeque)。Looper的`loop()`方法会不断调用`pollNext()`或`peekNext()`来获取Message。...
【Android_Handler01-...总之,`Android_Handler01-源码`项目提供了一个学习和实践Handler机制的平台,通过深入研究源码,开发者能够掌握Android中复杂的线程通信机制,这对于编写高效、稳定的Android应用至关重要。