对于Android的Message机制主要涉及到三个主要的类,分别是Handler、Message、Looper;首先对每个类做一个简单介绍;然后再介绍所谓的Android的Message机制是如何实现的,最后给了一个示例。
一、介绍三个相关的类
1、 Handler主要有两个用途:首先是可以定时处理或者分发消息,其次是可以添加一个执行的行为在其它线程中执行,
对于Handler中的方法,可以选择你关心的操作去覆盖它,处理具体的业务操作,常见的就是对消息的处理可以覆盖public voidhandleMessage(参数)方法,可以根据参数选择对此消息是否需要做出处理,这个和具体的参数有关。例如下代码:
Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {//覆盖handleMessage方法
switch (msg.what) {//根据收到的消息的what类型处理
case BUMP_MSG:
Log.v("handler", "Handler===="+msg.arg1);//打印收到的消息
break;
default:
super.handleMessage(msg);//这里最好对不需要或者不关心的消息抛给父类,避免丢失消息
break;
}
}
};
2、 消息android.os.Message
android.os.Message是定义一个Messge包含必要的描述和属性数据,并且此对象可以被发送给android.os.Handler处理。属性字段:arg1、arg2、what、obj、replyTo等;其中arg1和arg2是用来存放整型数据的;what是用来保存消息标示的;obj是Object类型的任意对象;replyTo是消息管理器,会关联到一个handler,handler就是处理其中的消息。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。
3、 Looper类主要用于一个线程循环获取消息队列中的消息。
Looper的作用主要是负责管理消息队列,负责消息的出列和入列操作。
二、Android的Message机制是如何实现?
1、为什么要使用Message机制主要是为了保证线程之间操作安全,同时不需要关心具体的消息接收者,使消息本身和线程剥离开,这样就可以方便的实现定时、异步等操作。
2、Message机制原理示意图:
Activity <---------------> EHandler<-----> Looper<-----> MessageQueue
IntentReceiver<-----> EHandler <-----> Looper<-----> MessageQueue
图 1
3、 如何实现?(具体描述上图的消息流的过程)
实现Message机制需要Handler、Message、Looper三个之间的互相作用来实现;当线程A需要发消息给线程B的时候,线程B要用自己的Looper实例化Handler类,就是构造handler对象时,把当前线程的Looper传给Handler构造函数,handler本身会保存对Looper的引用,handler构造好以后,就可以用handler的obtainMessage方法实例化Message对象,只要把要传的数据给Handler,Handler就会构造Message对象,并且把Message对象添加到消息队列里面。然后就可以调用handler的sendMessage方法把Message对象发送出去,Looper就把消息放到消息队列中;最后当Looper知道消息队列不为空时候,就会循环的从消息队列中取消息,取出消息就会调用刚才实例化好的Handler对象的handleMessage方法取处理消息,整个Message过程就是这样。(如图1所示)
三、下面介绍一个关于Message机制的简单的示例,具体的代码如下:
1、 下面是一个新起的一个线程发消息的示例
handler本身不仅可以发送消息,还可以用post的方式添加一个实现Runnable接口的匿名对象到消息队列中,在目标收到消息后就可以回调的方式在自己的线程中执行run的方法体,这就是handler两种典型的使用方式!
class NoLooperThread extends Thread {
private EventHandler mNoLooperThreadHandler;
public void run() {
Looper myLooper, mainLooper;
myLooper= Looper.myLooper(); //获得自己的Looper
mainLooper= Looper.getMainLooper(); //获得自己的main的looper
String obj;
if (myLooper == null) {
mNoLooperThreadHandler = new EventHandler(mainLooper);
obj= "NoLooperThread has no looper andhandleMessage function executed in main thread!";
}else
{
mNoLooperThreadHandler = new EventHandler(myLooper);
obj= "This is from NoLooperThread self andhandleMessage function executed in NoLooperThread!";
}
mNoLooperThreadHandler.removeMessages(0); //清空消息队列
if (false == postRunnable) {
Message m = mNoLooperThreadHandler.obtainMessage(2, 1, 1, obj); //生成消息对象
mNoLooperThreadHandler.sendMessage(m); //发送消息
Log.e(sTag, "NoLooperThread id:" + this.getId());
}else {
mNoLooperThreadHandler.post(new Runnable() { //添加一个Runnable接口的实现到消息队列,此Runnable接口的实现不在此 线程中执行,会在接收的线程中执行。
public void run() {
tv.setText("update UI through handler post runnalbe mechanism!");
noLooerThread.stop();
}
});
}
}
下面是一个定时循环发消息的示例,如下代码:
详细的解释参考代码的注释
Handler handler = new Handler() { //创建处理对象handler
publicvoid handleMessage(Message msg) {
switch (msg.what) {
caseMES: {
final int N = mCallbacks.beginBroadcast(); //Copy一份回调list,并且标记一个状态
for (int i = 0; i <N; i++) {
try {
mCallbacks.getBroadcastItem(i).getValue(mMediaPlayer01.getCurrentPosition()); //遍历所有回调接口 }catch (Exception e) {
e.printStackTrace();
}
}
mCallbacks.finishBroadcast(); //完成后状态复位
sendMessageDelayed(obtainMessage(MES),1 * 1000);
}
break;
default:
super.handleMessage(msg);
}
}
};
NOTE: 整个hadleMessage方法相当一个嵌套的循环
四、总结:
所谓的消息机制其实很简单,实现这种机制需要只需要四步:
1、实例化Looper(因为实例化Handler时需要一个looper);
2、实例化Handler,这里需要覆盖handleMessage方法,处理收到的消息;
3、 实例化Message对象,调用已经实例化好的handler对象的obtainMessage方法,把数据传给obtainMessage方法,obtainMessage方法就会实例化一个Message对象。(这里也可以发送实现Runnable接口的对象);
4、调用Handler的sendMessage方法把实例化好的Message对象发送出去。
对每个线程过程都是一样的,只要按照上面的四个步骤来就可以发送和接收消息了。
转至:http://blog.csdn.net/dadoneo/article/details/7667726
分享到:
相关推荐
### Handler_Message_Looper 小结 #### 一、核心概念及作用 1. **Thread (线程)**:线程是程序执行的基本单位之一。在Android应用开发中,线程被分为**主线程**(Main Thread)和**子线程**(Worker Thread)。主线程...
【Android知识小结第一章】 本章节主要涵盖了Android开发中的一些核心知识点,特别是针对面试中常见的问题进行了总结。以下是对这些知识点的详细解释: 1. 开启多进程:在Android中,可以通过在AndroidManifest....
15个Android很有用的代码片段、Android_GPS架构分析、android_JNI编程_一些技巧、Android_NDK开发实例、Android_RIL层剖析(官方翻译)、Android的Message机制(简单小结)、Android的主题和风格介绍、Android日历完整...
Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,Android日历完整实现,Android摄像头的应 用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,...
Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,Android日历完整实现,Android摄像头的应 用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,...
### 小结 《Android Book》不仅是一部详尽的Android线程模式教程,更是对Android系统架构深入剖析的宝典。无论你是初学者还是有经验的开发者,这本书都能提供宝贵的指导,帮助你掌握Android开发的核心技术,特别是...
#### 四、小结 通过上述步骤,我们已经成功实现了基于`Button`的事件处理机制。用户可以点击按钮触发相应的操作,例如跳转到新的页面、改变文本视图的内容或者显示一条提示消息等。这种方法是Android应用开发中最...
1.3 本章小结 第2章 深入理解Java Binder和MessageQueue 2.1 概述 2.2 Java层中的Binder架构分析 2.2.1 Binder架构总览 2.2.2 初始化Java层Binder框架 2.2.3 addService实例分析 2.2.4 Java层Binder架构...
Android签名机制 什么是Android签名 了解 HTTPS 通信的同学都知道,在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改。 同理,在安装 apk 时,同样也需要确保 apk 来源...
以上是【小结NT_Q&A.docx】中涉及的主要知识点,涵盖了Android应用开发中的Activity启动流程、消息传递机制、动画实现以及性能优化策略。这些知识点对于理解和优化Android应用的运行效率至关重要。
- **本章小结**:对第一章所讲的内容进行了概括性总结,强调了搭建好开发环境对于深入研究Android系统的重要性。 #### 第2章:深入理解JavaBinder和MessageQueue - **Java层中的Binder架构分析**: - **Binder...
小结 理解并熟练使用Android中的线程和异步操作是提高应用性能和用户体验的关键。在设计应用时,应该根据任务类型和需求选择合适的异步处理方式,以实现高效的多线程编程。在实际项目中,可以结合使用多种机制,...
在Android开发中,实现计时与倒计时功能是常见的需求,这通常涉及到UI更新和后台任务的协调。本文将探讨三种常用的实现方法:Timer与TimerTask、TimerTask与Handler以及直接使用Handler与Message。 **方法一:Timer...
Handler是Android中的消息处理机制,它可以接收并处理来自其他线程的消息。在这里,我们需要创建一个Handler实例,并重写handleMessage()方法,根据消息类型执行相应的操作: ```java Handler handler = new ...
**8.5 本章小结** 本章详细介绍了Android Service的各个方面,包括它的生命周期、启动和绑定方式,以及如何在不同场景下使用Service,如BroadcastReceiver、系统服务、线程更新和AIDL服务。理解并熟练掌握Service的...
小结 Android 界面刷新是 Android 开发中非常重要的一部分,通过使用 Handler 或 postInvalidate() 方法,我们可以轻松实现界面的刷新。这些方法可以在线程中调用,并且可以保证 UI 的实时更新和交互性。 在实际...
6. **课堂小结**:强调Handler的特点(如消息队列、回调处理)及其在实际项目中的作用,指出根据项目需求设计思路的重要性,以及在Android中正确使用Handler更新UI的难点。 通过这个教案,学生不仅能掌握Handler的...