返回

Handler 解析:从何获取 Looper?

Android

在 Android 中,Handler 是一种消息处理机制,它允许线程间通信。理解 Handler 的工作原理对于编写健壮且高效的 Android 应用程序至关重要。本文将深入探讨 Handler,重点关注一个关键问题:从何处获取 Looper

HandlerLooper

Handler 需要一个 Looper 对象才能工作。Looper 负责从消息队列中检索和分发消息。每个线程只有一个 Looper 和一个消息队列。

Handler 可以从构造函数中获取 Looper,也可以通过 Looper.getMainLooper() 获取主线程的 Looper。但是,从何处获取 Looper 取决于 Handler 的使用场景。

使用主线程 Looper

对于与 UI 线程交互的 Handler,使用主线程的 Looper 是必不可少的。这确保了消息可以立即分发到 UI 线程,从而避免竞争条件。要获取主线程的 Looper,请使用 Looper.getMainLooper()

Handler handler = new Handler(Looper.getMainLooper());

使用自定义 Looper

对于在单独线程中处理消息的 Handler,创建一个自定义 Looper 是必要的。这允许您控制消息分发线程的优先级和行为。要创建自定义 Looper,请使用 Looper.myLooper()

Looper myLooper = Looper.myLooper();
Handler handler = new Handler(myLooper);

Message.targetHandler

值得注意的是,当使用自定义 Looper 时,将消息发送到 Handler 会导致 Message.target 字段指向 Handler 对象。这是因为 Handler 持有 Looper 的引用。

Message msg = new Message();
msg.target = handler;
handler.sendMessage(msg);

结论

理解从何处为 Handler 获取 Looper 是至关重要的。根据 Handler 的使用场景,您可以选择使用主线程 Looper 或创建自定义 Looper。通过正确获取 Looper,您可以确保 Handler 以预期的方式有效工作。