Handler 是 Android 系统中用于线程间通信的核心机制,它基于消息队列(MessageQueue)和循环器(Looper)实现,主要用于在不同线程间发送和处理消息。
核心组件
-
Handler:消息的发送者和处理者
- 发送消息到 MessageQueue
- 处理从 MessageQueue 取出的消息
-
MessageQueue:消息队列
- 以队列形式管理 Message
- 按时间顺序排列消息
-
Looper:消息循环
- 不断从 MessageQueue 取出消息
- 将消息分发给对应的 Handler 处理
-
Message:消息载体
- 包含消息内容和处理者信息
工作原理
-
主线程的 Looper 准备:
- Android 主线程(UI 线程)在启动时就已经通过
Looper.prepareMainLooper()
初始化了 Looper - 开发者无需手动为主线程创建 Looper
- Android 主线程(UI 线程)在启动时就已经通过
-
子线程使用 Handler:
java// 在子线程中 Looper.prepare(); // 初始化Looper Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // 处理消息 } }; Looper.loop(); // 开始消息循环
-
消息发送流程:
- Handler 发送消息 (
sendMessage()
或post()
) - 消息被加入 MessageQueue
- Looper 不断循环从 MessageQueue 取出消息
- 消息被分发回 Handler 的
handleMessage()
处理
- Handler 发送消息 (
常用方法
-
发送消息:
sendMessage(Message msg)
sendEmptyMessage(int what)
post(Runnable r)
sendMessageDelayed(Message msg, long delayMillis)
-
处理消息:
handleMessage(Message msg)
(需重写)
-
移除消息:
removeMessages(int what)
removeCallbacks(Runnable r)
内存泄漏问题
Handler 使用不当容易引起内存泄漏,常见场景:
- 非静态内部类 Handler 隐式持有外部类(如 Activity)引用
- 消息队列中未处理完的消息持有 Handler 引用
解决方案:
-
使用静态内部类 + WeakReference
javaprivate static class MyHandler extends Handler { private WeakReference<Activity> mActivity; public MyHandler(Activity activity) { mActivity = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { Activity activity = mActivity.get(); if (activity != null) { // 处理消息 } } }
-
在 Activity 销毁时清除消息
java@Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacksAndMessages(null); }
典型应用场景
- 子线程执行耗时任务后更新 UI
- 定时任务执行
- 延迟任务处理
- 不同组件间的通信
Handler 机制是 Android 异步编程的基础,理解其原理对于开发高效、稳定的 Android 应用至关重要。