Handler 解析:从何获取 Looper?
2023-10-04 14:03:33
在 Android 中,Handler
是一种消息处理机制,它允许线程间通信。理解 Handler
的工作原理对于编写健壮且高效的 Android 应用程序至关重要。本文将深入探讨 Handler
,重点关注一个关键问题:从何处获取 Looper
?
Handler
与 Looper
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.target
与 Handler
值得注意的是,当使用自定义 Looper
时,将消息发送到 Handler
会导致 Message.target
字段指向 Handler
对象。这是因为 Handler
持有 Looper
的引用。
Message msg = new Message();
msg.target = handler;
handler.sendMessage(msg);
结论
理解从何处为 Handler
获取 Looper
是至关重要的。根据 Handler
的使用场景,您可以选择使用主线程 Looper
或创建自定义 Looper
。通过正确获取 Looper
,您可以确保 Handler
以预期的方式有效工作。