Android中提供一种异步机制Hander,通过Handler 可以完成一种长时间后台执行后的回调通知。本文介绍Android Handher机制,如图1所显示,Handler机制共包含三个组件:Handler、Looper、MessageQueue。
图1: Handler 实现机制
Handler中包含了Looper执行对象,messageQueue。其中Handler将消息及执行runnable 送到MessageQueue中。由Looper负责将MessageQueue中的消息读取出来,并分发执行。因为Looper中存在localtread,可以实现异步执行。
Handler的处理:
1. Handler 通过SendMessageAPIs,如:sendEmptyMessageDelayed,sendEmptyMessageAtTime等API将消息发送到MessageQueue中
2. 在Handler生成消息时,通过 msg.target = this;将Message的target指定成当前Handler。
3. Handler可以将未执行的Message从消息队列中删除,通过RemoveMessageAPIs来实现,如:removeMessages
4. Handler同样可以发生一runnable对象到消息队列中,实现异步执行。注意真正执行的线程是Looper中的现成,runnable只是提供一个Run方法
Looper的处理:
Looper中线程不停的从消息队列中读取消息,并分发执行,读取的每一个消息都通过 msg.target.dispatchMessage(msg)来分发执行。从Handler处理中的2可知,msg.target 就是对应的Handler。再回过头来看Handler中dispatchMessage的实现。
1. public void dispatchMessage(Message msg) {
2. if (msg.callback != null) {
3. handleCallback(msg);
4. } else {
5. if (mCallback != null) {
6. if (mCallback.handleMessage(msg)) {
7. return;
8. }
9. }
10. handleMessage(msg);
11. }
12. }
1. 第二行的msg.callback就是handler处理中的Post的Runnable,如果是post的Runnable,runnable就是对应的callback,那么执行Runable的run方法。
2. 如果不是post的Runnable,那就看Handler自身有没有设置Callback,如果有,那么先有Callback来执行,上述第5行代码。该callback可以通过Handler的构造函数来设置
3. 最后将会执行Handler中的handleMessage函数,通常情况我们在使用Handler时都会重写Handler中的handleMessage方法来实现我们需要的功能。
注意事项:Hanlder对应的Looper都有一个线程,在主线程中已经创建了,如果在非主线程中创建Handler,需要先生成Looper。如下:
class MyThread extends Thread {
public void run() {
// 其它线程中新建一个handler
Looper.prepare();// 创建该线程的Looper对象,用于接收消息,在非主线程中是没有looper的所以在创建handler前一定要使用prepare()创建一个Looper
myThreadHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
Log.d(Constant.TAG, MessageFormat.format("Thread[{0}]--myThreadHandler handleMessage run...", Thread
.currentThread().getName()));
}
};
Looper.myLooper().loop();//建立一个消息循环,该线程不会退出
}
}