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

各位看官们大家好,上一回中咱们说的是Android中Handler机制的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,我们在上一回中通过具体的例子演示了如何去使用Hanlder机制来发送和接收消息,这一回中我们分析一下它的源代码,主要是查看隐藏在它背后的实现原理。

我们先看看Handler类,它位于frameworks/base/core/java/android/os/Handler.java文件中。它有多个构造函数,我们不去一一分析它们,其主要功能是给成员变量赋值,我们重点看一下两个经常使用的成员变量:

  • final Looper mLooper; //这个是消息队列的管理者
  • Looper final MessageQueue mQueue; //这个是消息队列

对它们的赋值是通过构造函数进行的,构造函数是重载的,我们只看其中的一个实现,并且省略了其它的异常处理细节:

 public Handler(Callback callback, boolean async) {
     mLooper = Looper.myLooper();
     mQueue = mLooper.mQueue;
 }

从源代码中可以看到,它们的赋值都是通过Looper实现的,这里只做个说明,我们会在后面章回中介绍Looper类时做详细分析。

接下来我们看看Handler为中常用的方法,首先看看它的handleMessage方法,其源代码如下:

   /**
     * Subclasses must implement this to receive messages.
     */
    public void handleMessage(Message msg) {
    }

大家可以看到,这是个空方法,而且注释中也说明了,子类需要实现它以便用来接收消息。另外还有一个叫dispatchMessage的方法也需要关注一下,Loooper就是通过它来回调handleMessage方法,下面是它的源代码,从源代码中也可以看到这点:

 public void dispatchMessage(Message msg) {
     if (msg.callback != null) {
         handleCallback(msg);
      } else {
          if (mCallback != null) {
              if (mCallback.handleMessage(msg)) {
                  return;
              }
          }
          handleMessage(msg);
      }
  }

最后我们看看发送消息的方法,各个方法的实现大同小异,我们只列出函数原型以及其功能,详细的源代码不再一一列出:

 public final boolean sendMessage(Message msg)                            //发送消息到消息队列中
 public final boolean sendEmptyMessage(int what)                          //发送空消息到消息队列中
 public final boolean sendMessageDelayed(Message msg, long delayMillis)   //延迟发送消息到消息队列中
 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) //延迟发送空消息到消息队列中
 public final void removeMessages(int what)                               //删除消息队列中的消息
 public final boolean hasMessages(int what)                               //判断消息队列中是否有消息

以上发送消息的方法最终都是通过私有方法enqueueMessage把消息添加到消息队列中的,其源代码如下:

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
     msg.target = this;
     if (mAsynchronous) {
         msg.setAsynchronous(true);
     }
     return queue.enqueueMessage(msg, uptimeMillis);
 }

各位看官,关于Android中Handler机制的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

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

猜你喜欢

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