各位看官们大家好,上一回中咱们说的是Android中Handler机制的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!
看官们,我们在上一回中分析了Handler类的源代码,本章回中将分析Looper类的源代码。它的实现在frameworks/base/core/java/android/os/Looper.java
文件中。
我们先看看它的成员变量,主要的有两个:一个是用来存放消息队列,另外一个用来存放当前的线程,它们在构造函数中被初始化,详细的源代码如下:
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed); //消息队列在这里创建
mThread = Thread.currentThread();
}
接下来我们重点看一下常用的方法,首先是prepare
方法,它主要用来做Looper的初始化工作,主要内容就是构造一个Looper对象并且和线程关联起来,其源代码如下:
public static void prepare() {
prepare(true);
}
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
接着我们分析myLooper方法,它主是返回当前线程中的Looper对象
public static @Nullable Looper myLooper() {
return sThreadLocal.get();
}
最核心的方法出场了,它就是loop方法。它主要功能就是运行消息循环,看完源代码后就会发现本质上是遍历队列,下面是它的源代码,我们忽略了许多非核心操作:
public static void loop() {
final Looper me = myLooper(); //获取当前线程中的Looper
final MessageQueue queue = me.mQueue; //获取Looper中的消息队列
for (;;) { //启动消息循环
Message msg = queue.next(); //遍历消息队列中的每条消息
msg.target.dispatchMessage(msg); //通过dispatchMessage方法回调Handler中的handleMessage方法处理消息
}
}
最后介绍的是quit方法,它用来退出当前Looper运行的消息循环,下面是它的源代码:
public void quit() {
mQueue.quit(false);
}
各位看官,关于Android中Handler机制的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!