一、线程间通讯的Message机制
1、Message介绍
frameworks\base\core\java\android\Os\Message.java
Message是线程之间传递信息的载体,包含了对消息的描述和任意的数据对象。Message中包含了两个额外的 int字段和一个object字段,这样在大部分情况下,使用者就不需要再做内存分配工作了。虽然Message的构造函数是public的,但是最好是使用Message.obtain( )或Handler.obtainMessage( )函数来获取Message对象,因为Message的实现中包含了回收再利用的机制,可以提供效率。
2、MessageQueue介绍
frameworks\base\core\java\android\Os\MessageQueue.java
MessageQueue用来容纳Message队列的,其中的Message是由Looper来分发的,Message不能直接添加到MessageQueue中,而是要通过与Looper关联的Handler去添加。
3、Looper
frameworks\base\core\java\android\Os\Looper.java
Looper是线程用来运行消息循环的。线程本身是没有消息循环的,需要在线程中调用perpare函数,然后调用loop去处理消息。在Android中,系统在启动主线程的时候会自动为之建立一个Looper。
建立本线程的Looper:
public static final void prepare()
运行本线程的Looper:
public static final void loop()
获取本线程的Looper:
public static final Looper myLooper()
获取主线程的Looper:
public synchronized static final Looper getMainLooper()
4、Handler
frameworks\base\core\java\android\Os\Handler.java
Handler是用来发送和处理与线程相关联的Message和Runnable对象的。每个Handler都与一个单独的线程以及线程消息队列相关联的。当你创建Handler时,Handler就与线程以及线程消息队列绑定了,从那以后,Handler就可以将 Message和Runnable发送给对应的消息队列,并且能够处理从消息队列中出来的消息。
Handler提供了用户需要调用的大部分接口
A、创建Handler:
创建与本地线程相关联的Handler:
3 |
public Handler(Callback callback)
|
创建与指定线程相关联的Handler:
1 |
public Handler(Looper looper)
|
3 |
public Handler(Looper looper, Callback callback)
|
B、创建消息
1 |
public final
Message obtainMessage()
|
3 |
public final
Message obtainMessage( int
what)
|
5 |
public final
Message obtainMessage( int
what, Object obj)
|
7 |
public final
Message obtainMessage( int
what, int
arg1, int arg2)
|
9 |
public final
Message obtainMessage( int
what, int
arg1, int arg2, Object obj)
|
C、删除消息
删除在消息队列中未处理的消息
1 |
public final
void removeMessages( int
what)
|
3 |
public final
void removeMessages( int
what, Object object)
|
D、发送消息
1 |
public final
boolean sendMessage(Message msg)
|
3 |
public final
boolean sendMessageDelayed(Message msg,
long delayMillis)
|
5 |
public final
boolean post(Runnable r)
|
7 |
public final
boolean postDelayed(Runnable r,
long delayMillis)
|
E、处理消息
在Looper的loop函数中循环取出MessageQueue的接收消息队列中的消息,然后调用Hander的dispatchMessage函数对消息进行处理,至于如何处理(相应消息)则由用户指定(三个方法,优先级从高到低:Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;Handler里面的mCallback指向的一个实现了Callback接口的对象,里面的handleMessage进行处理;处理消息 Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息)。
01 |
public void
dispatchMessage(Message msg) {
|
03 |
if (msg.callback !=
null ) {
|
08 |
if
(mCallback != null ) {
|
09 |
if
(mCallback.handleMessage(msg)) {
|
二、Message机制的用途
Message机制有两种用途:
定时执行:延迟到指定时间执行消息调度
线程通讯:将某些操作在其他线程中排队执行
1、定时执行
通过本线程的Handler将消息延迟到指定时间执行,相当于定时器的作用
1 |
public final
boolean sendMessageDelayed(Message msg,
long delayMillis)
|
3 |
public final
boolean postDelayed(Runnable r,
long delayMillis)
|
还可以在指定时间到期之前,通过removeMessages取消执行
2、线程通讯
Android的UI是单线程的,Android希望UI线程能够给予User快速的反应,如果UI线程花费太多的时间做幕后的事情,吵过5秒钟,Android就会给出错误提示。因此为了避免拖住UI,一下较费时的工作应该交给独立的线程去执行。但是如果幕后的线程来执行UI对象,Android又会发出错误信息,所以UI线程与幕后线程需要进行通讯。UI线程将工作分发给幕后线程,幕后线程执行后将相应的状态返回给UI线程,让UI线程对UI做成相应的更新。
分享到:
相关推荐
NULL 博文链接:https://kevin2562.iteye.com/blog/687081
对于Android的Message机制主要涉及到三个主要的类,分别是Handler、Message、Looper;首先对每个类做一个简单介绍;然后再介绍所谓的Android的Message机制是如何实现的,最后给了一个示例。
Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制
详细描述了Android的消息处理机制,Message和MessageQueue类的详解
Android中的Message机制,对消息机制的详细描述。
Android中的Handler的消息机制
Android应用源码之HandlerMessage1_HandlerMessage
跨平台的Android Message应用程序。.zip,Android Messages as a Cross-platform Desktop App
主要对handler 、message机制进行了详解,如果想了解更多android相关知识,可以去我博客看看
从源码出发,详细的解析了android中的消息机制,分析清楚Looper和MessageQueue以及Handler三者之间的关系。
Android应用源码之HandlerMessage2_应用
很简单的例子,还有详细博客讲解记。
android 消息机制 深入理解android的消息机制 更好开发
android的多线程消息处理机制核心成员handler,基本用法很简单,相关资料也很多。本例子给大家带来handler的奇葩用法,与大家一起分享。
Android 消息处理机制之 Message 中 obtain()源代码剖析 http://blog.csdn.net/ahuier/article/details/17012923
android多线程机制教程 android多线程机制 android多线程机制 android多线程机制
loop()方法是个死循环,将会不停的从MessageQueue对象中获取Message对象,如果MessageQueue 对象中不存在Message对象,则结束本次循环;最终将会执行handleMessage()方法,也就是我们ServiceHandler类中复写的方法。...
Talking about Android Message Queue
android project for sending message
Android里并没有Global的Message Queue数据结构,例如,不同APK里的对象不能透过Massage Queue来交换讯息(Message)。 一个线程可以诞生一个Looper之对象,由它来管理此线程里的Message Queue。 你可以诞生...