一起Talk Android吧(第一百七十五回:Android的中Handler机制四)

各位看官们大家好,上一回中咱们说的是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机制的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

发布了528 篇原创文章 · 获赞 131 · 访问量 62万+

猜你喜欢

转载自blog.csdn.net/talk_8/article/details/105182955