Android 的消息处理机制 -- Looper,Hander,Message
1、Android的消息处理有三个核心类:Lopper,Handler和Message; 另外还有个 Message Queue (消息队列) , 但MQ 被封装到了Looper 里面了,所以不会直接的和MQ打交道,因此不是核心的类;
2、线程的魔法师Looper:Looper 的字面意思是"循环者" ,被设计来使一个普通线程变成Lopper 线程。即循环工作的线程。循环线程,一个线程不断的循环,一旦有了新的任务则执行,执行完继续等待下一个任务,这就是Looper线程;
Looper 的加深理解:
A、Looper 线程就是循环工作的线程;
B、一个Thread只能有一个Looper对象,它是一个ThreadLocal;
C、一个线程可以有多个Handler,但是只能有一个Looper
3、如何创建一个Looper 线程:
/**
* 创建一个循环线程
* @author Administrator
* 线程,继承了Thread
*/
public class LooperThread extends Thread {
public void run() {
// 将当前的线程初始化为Looper线程
Looper.prepare();
//......
// Looper 开始工作,调用loop() 方法,
// 不断的从自己的MQ中取出队头的消息(任务)执行
Looper.loop(); // 开始循环线程
}
}
通过以上的核心代码,当前的线程就可以升级为Looper线程了;
4、Looper 类的介绍:
除了prepare() 和 loop() 方法,Looper 类还提供了一些有用的方法:
Looper.myLooper(); // 得到当前线程Looper对象;
public static final Looper myLooper(){
// 在任意线程调用Looper.myLooper() 返回的都是那个线程的Looper
return (Looper)sThreadLocal.get();
}
getThread() 得到looper对象所属线程;
public Thread getThread(){
return mThread;
}
quit(); 方法结束looper循环;
public void quit(){
// 创建一个空的message, 它的target为null,表示结束循环消息
Message msg = Message.obtain();
//发出消息
mQueue.enqueueMessage(msg,0);
}
5、Looper的总结:
a、每个线程有且最多只能有一个Looper对象,它是一个ThreadLocal;
b、Looper内部有一个消息队列,loop() 方法调用后线程开始不断从队列中取出消息执行;
c、Looper使一个线程变成Looper线程;
6、Handler的理解:
异步处理大神,handler扮演了往MQ上添加消息和处理消息的角色(只处理由自己发出的消息),即通知MQ它要执行一个任务(sendMessage),并在loop到自己的时候执行该任务(handleMessage),整个过程是异步的。handler创建时会关联到一个looper,默认的构造方法将关联当前线程的looper,不过这也是可以set的;
温习提示: post发出的Runnable对象最后都被封装成了Message对象;
handleMessage(Message msg);为"钩子方法";
android 中的主线程也是一个looper线程;
7、Handler的用处:
A、可以在任意线程中发送消息,这些消息会被添加到关联的MQ上。
B、handler是在它关联的looper线程中处理消息的;
8、案例:线程之间进行消息的传递,主线程发消息给自己
注意:这里使用static修饰,因为在项目中便于单元测试,可以自行设计;
private static Handler handler; // 消息处理
/**
* 测试:主线程发消息给自己
*/
public static void toOwn() {
// 得到主线程的Looper对象
Looper looper = Looper.getMainLooper();
// 根据主线程的looper创建handler,所以这个handler发送的Message
// 会被传递给主线程的MessageQueue(消息队列)
handler = new Handler(looper) {
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("msg", "我是主线程,执行收到的消息:"+msg.obj.toString());
}
};
//
handler.removeMessages(0); // 移除
//提示:通过Message.obtain()来从消息池中获得空消息对象
// 以便节约资源
Message msg = handler.obtainMessage(1, 1, 1, "来自主线程的消息");
handler.sendMessage(msg); // 发送消息
}
/* ---------------- 主线程发消息给子线程 ------------------- */
/**
* 测试:主线程发消息给子线程
*/
public static void mainToChild(){
// 创建一个线程
thread = new Thread(new Runnable() {
// 线程任务
public void run() {
Log.i("msg", "子线程启动...");
Looper.prepare();// 创建该线程的Looper对象,用于接收消息
handler2_1 = new MyHandler(Looper.myLooper());
Log.i("msg", "对象创建完成");
Looper.loop();
}
});
thread.start(); // 启动线程
// 根据主线程的Looper对象创建Handler
handler2 = new Handler(Looper.getMainLooper()){
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("msg", "我是主线程的Handler,收到消息:"+msg.obj.toString());
// 此处 主线程可以将数据给子线程
handler2_1 = new MyHandler(Looper.myLooper());
Message msg2 = handler2_1.obtainMessage(1, 1, 1, "主传子");
handler2_1.sendMessage(msg2);
}
};
Message msg = handler2.obtainMessage(1, 1,1,"主线程进来了,开始分发数据");
handler2.sendMessage(msg); // 发送消息队列
}
子线程数据处理类:
public class MyHandler extends Handler {
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("msg","我是子线程,收到消息为:"+msg.obj.toString());
}
public MyHandler(Looper looper) {
super(looper);
}
}
另外还有:子线程给主线程发送数据 , 子线程给子线程发送数据; 其实对于Looper的理解也很简单,Handler的对象如果是以主线程构建的则处理主线程的MQ ,如果以子线程Looper对象创建Handler对象,则为处理子线程的MQ消息队列;
分享到:
相关推荐
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
### Android之Looper、MessageQueue、Handler与消息循环详解 #### 一、概述 在Android开发过程中,消息处理机制是至关重要的部分,它涉及到应用程序如何管理、传递和响应各种事件。本篇文章将深入探讨Android中...
理解Thread、Looper、Handler、Message、MessageQueue和MessagePool之间的关系对于优化Android应用的性能和响应速度至关重要。开发者需要熟练掌握这一机制,以便在多线程环境中正确处理异步任务,保证UI的流畅性。在...
【Android 线程间通信:Handler、Looper 和 MessageQueue 深度解析】 在 Android 应用开发中,为了保证界面的流畅性,我们通常需要将耗时操作放在非 UI 线程中执行,然后通过某种机制将结果传递回 UI 线程进行界面...
综上所述,Message、MessageQueue、Looper和Handler这四个组件共同构成了Android应用程序中处理消息的基本机制。通过它们之间的相互协作,使得应用程序能够在不同的线程间高效地传递和处理消息,从而实现了复杂的...
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信和异步处理的关键组件。它们共同构建了一个消息循环系统,使得应用程序可以在不同的线程之间传递和处理消息,尤其是在主线程(UI线程)与工作线程...
在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制,尤其是在主线程与工作线程之间同步数据和执行UI更新时。Handler、Looper和Message三者结合使用,构建了一个消息处理系统,使得非UI线程...
在Android系统中,Handler、Looper和MessageQueue是实现线程间通信的核心组件,它们共同构建了一个消息处理机制。本文将深入解析这三者的源码,帮助你理解它们的工作原理,并教你如何手写一套自己的Handler系统。 ...
`Handler`、`Message`和`Looper`是Android系统提供的一个关键机制,用于在不同的线程间进行通信,特别是主线程(UI线程)与工作线程间的交互。下面将详细解释这三个组件以及它们如何协同工作。 1. **Handler...
Handler、Looper和MessageQueue是Android异步处理机制中的核心组件,它们共同构建了一个消息传递系统,使得在不同线程间进行数据交换变得可能。下面我们将深入探讨这三个组件的工作原理及其在实际开发中的应用。 ...
在Android开发中,Handler...总的来说,理解Handler、Looper和MessageQueue的关系以及它们在Android中的作用,是提升应用程序性能和用户体验的关键。熟练掌握这些组件,有助于编写出更加高效、响应迅速的Android应用。
总结来说,`Android应用源码之HandlerMessage1_HandlerMessage.zip`中的内容可能展示了如何利用`Handler`、`Message`和`Looper`进行多线程间的通信,以确保UI线程的流畅运行。理解和掌握这一机制对于Android开发者来...
Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...
消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理,在单线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件...
总之,`Looper`是Android系统中的核心组件之一,它与`Handler`和`Message`共同构建了强大的异步处理机制。理解和熟练运用`Looper`,对于开发高效、流畅的Android应用程序至关重要。通过阅读指定的博客文章,你可以更...
Android 多线程Handler/Message机制详解 Android 多线程机制是 Android 应用程序中最重要的组件之一,它允许应用程序在后台执行一些操作,而不影响用户的交互体验。在 Android 中,多线程机制是基于 Handler 和 ...
android源码中包含了...android的消息处理有三个核心类: Looper,Handler和Message。 其实还有一个Message Queue(消息队列) , 但是MQ被封装到Looper里面了, 我们不会直接与 MQ打交道, 因此我没将其作为核心类。
在Android开发中,`Handler`、`Looper`和`Message`是实现线程间通信的重要组件,它们共同构建了一个消息处理机制。理解这三个概念对于优化应用程序的性能和用户体验至关重要。 `Handler`(处理器)是Android中的一...
通过以上介绍可以看出,Android的Message机制是通过`Handler`、`Message`、`Looper`和`MessageQueue`四个关键组件协同工作来完成的。这种机制不仅使得应用程序内部通信变得更加高效有序,同时也为开发者提供了一种...
这个压缩包"安卓Android源码——HandlerMessage3.rar"很可能包含了关于这三者如何协同工作的示例代码或者详细分析。现在,我们将深入探讨这些概念及其在Android系统中的作用。 `Handler` 是一个用于发送和处理消息...