====================================================================================================================================
一、JAVA层Handler、MessageQueue和Looper
1.三个类关系
MessageQueue类是在Looper类中被实例化的,并被记录下来:
frameworks/base/core/java/android/os/Looper.java
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);
mRun = true;
mThread = Thread.currentThread();
}
Looper类又是以参数的形式传递给Handler类的:
frameworks/base/core/java/android/os/Handler.java
public Handler(Looper looper, Callback callback) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
}
2.处理流程
首先会调用Handler的sendMessage:
frameworks/base/core/java/android/os/Handler.java
public final boolean sendMessage(Message msg){
return sendMessageDelayed(msg, 0);
}
public final boolean sendMessageDelayed(Message msg, long delayMillis){
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(Message msg, long uptimeMillis){
boolean sent = false;
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);
}
else {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}
接着我们看Looper类的死循环:
frameworks/base/core/java/android/os/Looper.java
public static void loop() {
final Looper me = myLooper();
......
final MessageQueue queue = me.mQueue;
......
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
return;
}
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
......
}
}
msg.target.dispatchMessage(msg)其实就是下面:
frameworks/base/core/java/android/os/Handler.java
public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
说明:一般继承Handler类都会重新实现handleMessage函数,完成消息处理。
二、C++层Looper应用
C++层Looper是在实例化时创建睡眠/唤醒管道、传入回调函数;当通过唤醒管道唤醒进程时,首先执行回调函数处理的。与JAVA层机制不一样!