Android 处理程序 handleMessage() 方法调用

Android handler handleMessage() method call

当我们在主 UI 线程中实例化一个 Handler 对象(对于这个例子,假设我使用匿名内部 class)。

Handler h = new Handler () {
    @override
    public void handleMessage (Message msg) {
        /* Code to handle the message */
    }
};

我们可以将此 Handler 对象引用传递给其他线程,这些线程可以使用此引用 (h.sendMessage()) post 将状态更新到 UI 线程。

疑问:我们没有在任何地方向 Activity class 或 UI 提供自定义匿名 class 引用 h Handler线。为了调用重写的方法 UI 线程必须具有对我们的 class 的对象引用。那么如何调用覆盖的 handleMessage() 而不是默认的呢?

您的 handleMessage() 正在被 Looper 呼叫。您可以在处理程序中看到 here that looper calls dispatchMessage on message target which is a Handler. And target is being assigned a this reference when you post a message。所以流程如下:

  1. 你 post 你的处理程序上的一条消息,它在内部创建一个 Message 对象并引用它的处理程序。

  2. 该消息被放入由主要UI线程管理的消息队列(在这种特殊情况下)

  3. 时间到了,Android 正在从队列中删除您的消息并使用其目标字段 - 对其调用 handleMesage。

此外 - 重要的是,如果您在创建 Handler 时没有指定特定的 Looper,则默认 Looper 将用于实例化它的线程。在你的情况下,它的 Main UI Looper.

你可以打电话给 h.sendEmptyMessage()