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。所以流程如下:
你 post 你的处理程序上的一条消息,它在内部创建一个 Message 对象并引用它的处理程序。
该消息被放入由主要UI线程管理的消息队列(在这种特殊情况下)
时间到了,Android 正在从队列中删除您的消息并使用其目标字段 - 对其调用 handleMesage。
此外 - 重要的是,如果您在创建 Handler 时没有指定特定的 Looper,则默认 Looper 将用于实例化它的线程。在你的情况下,它的 Main UI Looper.
你可以打电话给 h.sendEmptyMessage()
当我们在主 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。所以流程如下:
你 post 你的处理程序上的一条消息,它在内部创建一个 Message 对象并引用它的处理程序。
该消息被放入由主要UI线程管理的消息队列(在这种特殊情况下)
时间到了,Android 正在从队列中删除您的消息并使用其目标字段 - 对其调用 handleMesage。
此外 - 重要的是,如果您在创建 Handler 时没有指定特定的 Looper,则默认 Looper 将用于实例化它的线程。在你的情况下,它的 Main UI Looper.
你可以打电话给 h.sendEmptyMessage()