1、线程间通信的Message机制java
一、Message介绍android
frameworks\base\core\java\android\Os\Message.java函数
Message是线程之间传递信息的载体,包含了对消息的描述和任意的数据对象。Message中包含了两个额外的 int字段和一个object字段,这样在大部分状况下,使用者就不须要再作内存分配工做了。虽然Message的构造函数是public的,可是最好是使用Message.obtain( )或Handler.obtainMessage( )函数来获取Message对象,由于Message的实现中包含了回收再利用的机制,能够提供效率。oop
二、MessageQueue介绍post
frameworks\base\core\java\android\Os\MessageQueue.javaspa
MessageQueue用来容纳Message队列的,其中的Message是由Looper来分发的,Message不能直接添加到MessageQueue中,而是要经过与Looper关联的Handler去添加。线程
三、Loopercode
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()
四、Handler
frameworks\base\core\java\android\Os\Handler.java
Handler是用来发送和处理与线程相关联的Message和Runnable对象的。每一个Handler都与一个单独的线程以及线程消息队列相关联的。当你建立Handler时,Handler就与线程以及线程消息队列绑定了,从那之后,Handler就能够将 Message和Runnable发送给对应的消息队列,而且可以处理从消息队列中出来的消息。
Handler提供了用户须要调用的大部分接口
A、建立Handler:
建立与本地线程相关联的Handler:
1 |
public Handler() |
2 |
3 |
public Handler(Callback callback) |
建立与指定线程相关联的Handler:
1 |
public Handler(Looper looper) |
2 |
3 |
public Handler(Looper looper, Callback callback) |
B、建立消息
1 |
public final Message obtainMessage() |
2 |
3 |
public final Message obtainMessage( int what) |
4 |
5 |
public final Message obtainMessage( int what, Object obj) |
6 |
7 |
public final Message obtainMessage( int what, int arg1, int arg2) |
8 |
9 |
public final Message obtainMessage( int what, int arg1, int arg2, Object obj) |
C、删除消息
删除在消息队列中未处理的消息
1 |
public final void removeMessages( int what) |
2 |
3 |
public final void removeMessages( int what, Object object) |
D、发送消息
1 |
public final boolean sendMessage(Message msg) |
2 |
3 |
public final boolean sendMessageDelayed(Message msg, long delayMillis) |
4 |
5 |
public final boolean post(Runnable r) |
6 |
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) { |
02 |
03 |
if (msg.callback != null ) { |
04 |
05 |
handleCallback(msg); |
06 |
07 |
} else { |
08 |
if (mCallback != null ) { |
09 |
if (mCallback.handleMessage(msg)) { |
10 |
return ; |
11 |
} |
12 |
} |
13 |
14 |
handleMessage(msg); |
15 |
} |
16 |
} |
2、Message机制的用途
Message机制有两种用途:
定时执行:延迟到指定时间执行消息调度
线程通信:将某些操做在其余线程中排队执行
一、定时执行
经过本线程的Handler将消息延迟到指定时间执行,至关于定时器的做用
1 |
public final boolean sendMessageDelayed(Message msg, long delayMillis) |
2 |
3 |
public final boolean postDelayed(Runnable r, long delayMillis) |
还能够在指定时间到期以前,经过removeMessages取消执行
二、线程通信
Android的UI是单线程的,Android但愿UI线程可以给予User快速的反应,若是UI线程花费太多的时间作幕后的事情,吵过5秒钟,Android就会给出错误提示。所以为了不拖住UI,一下较费时的工做应该交给独立的线程去执行。可是若是幕后的线程来执行UI对象,Android又会发出错误信息,因此UI线程与幕后线程须要进行通信。UI线程将工做分发给幕后线程,幕后线程执行后将相应的状态返回给UI线程,让UI线程对UI作成相应的更新。