返回

解密Handler源码(第一部分)

Android

Handler简介

Handler是Android应用程序中用于处理消息的类,它是一个异步消息处理机制,允许应用程序在主线程之外执行任务。Handler可以用来更新UI、执行网络请求、定时任务等。

Handler的使用

Handler的使用很简单,通常只需以下三个步骤:

  1. 创建一个Handler实例。
  2. 向Handler发送消息。
  3. 在Handler中处理消息。

构造函数分析

Handler有多个构造函数重载,其中最常用的一个构造函数是无参构造函数。这个构造函数会创建一个Handler实例,该实例与当前线程关联。

public Handler() {
    this(Looper.myLooper(), null, false);
}

第二个构造函数允许指定一个Looper对象,这个Looper对象指定了消息循环,消息循环是一个不断循环处理消息的机制。如果Looper对象为null,则Handler将使用当前线程的Looper对象。

public Handler(Looper looper) {
    this(looper, null, false);
}

第三个构造函数允许指定一个HandlerCallback对象,该对象实现了Handler.Callback接口,该接口定义了如何处理消息的方法。如果HandlerCallback对象为null,则Handler将使用默认的处理方法。

public Handler(Looper looper, Callback callback) {
    this(looper, callback, false);
}

第四个构造函数允许指定一个HandlerCallback对象和一个布尔值,该布尔值指定是否将Handler与当前线程关联。如果布尔值为true,则Handler将与当前线程关联。

public Handler(Looper looper, Callback callback, boolean async) {
    mQueue = looper.getQueue();
    mCallback = callback;
    mAsynchronous = async;
}

向Handler发送消息

向Handler发送消息可以通过Handler的sendMessage()方法,该方法允许发送一个Message对象。Message对象包含了要发送的消息内容,以及消息的处理方法。

public final boolean sendMessage(Message msg) {
    return sendMessageDelayed(msg, 0);
}

sendMessageDelayed()方法允许发送一个Message对象,并指定延迟的时间。延迟的时间以毫秒为单位。

public final boolean sendMessageDelayed(Message msg, long delayMillis) {
    if (delayMillis < 0) {
        delayMillis = 0;
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

sendMessageAtTime()方法允许发送一个Message对象,并指定发送的时间。发送的时间以毫秒为单位。

public final boolean sendMessageAtTime(Message msg, long uptimeMillis) {
    MessageQueue queue = mQueue;
    if (queue == null) {
        RuntimeException e = new RuntimeException(
                this + " sendMessageAtTime() called with no mQueue");
        Log.w("TAG", e.getMessage(), e);
        throw e;
    }
    return enqueueMessage(queue, msg, uptimeMillis);
}

enqueueMessage()方法将Message对象放入消息队列中,消息队列是一个先进先出的队列,这意味着最早发送的消息将首先被处理。

private static final boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
    msg.target = queue.mIdleHandler.thisMessageTarget;
    if (msg.target == null) {
        throw new IllegalStateException(msg.toString()
                + " does not have a target.");
    }

    return queue.enqueueMessage(msg, uptimeMillis);
}

在Handler中处理消息

当消息被发送到Handler后,Handler会调用handleMessage()方法来处理消息。handleMessage()方法可以根据Message对象的内容来执行不同的操作。

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

如果HandlerCallback对象不为null,则调用HandlerCallback对象的handleMessage()方法来处理消息。否则,调用Handler自身的handleMessage()方法来处理消息。

public void handleMessage(Message msg) {
    switch (msg.what) {
        case MSG_UPDATE_UI:
            // 更新UI
            break;
        case MSG_NETWORK_REQUEST:
            // 执行网络请求
            break;
        case MSG_定时任务:
            // 执行定时任务
            break;
    }
}

结语

本篇博客带领大家初步认识了Handler的使用,以及Handler是如何处理消息的。在下一部分中,我们将继续深入Handler的源码,分析Handler的内部实现细节,敬请期待。