本文共 2317 字,大约阅读时间需要 7 分钟。
====================================================================================================================================
一、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层机制不一样!
转载地址:http://rhgai.baihongyu.com/