Handler是Android中实现线程间通信的核心机制,用于在工作线程和主线程(UI线程)之间传递消息。
Handler机制的核心组件
1. Handler(处理器)
-
作用:发送和处理消息
-
特点:
- 绑定到创建它的线程的Looper
- 负责发送Message到MessageQueue
- 处理Looper分发的消息
2. Looper(循环器)
-
作用:消息循环,不断从MessageQueue取出消息
-
特点:
- 每个线程只能有一个Looper
- 主线程默认已创建Looper
- 子线程需要手动调用Looper.prepare()和Looper.loop()
3. MessageQueue(消息队列)
-
作用:存储消息的队列
-
特点:
- 先进先出(FIFO)
- 按时间排序(when字段)
- 底层使用单链表实现
4. Message(消息)
-
作用:携带数据和信息的载体
-
属性:
- what:消息标识
- arg1/arg2:整型参数
- obj:对象参数
- callback:Runnable回调
Handler工作流程
shell发送消息流程: Handler.sendMessage() → MessageQueue.enqueueMessage() → 消息入队 处理消息流程: Looper.loop() → MessageQueue.next() → Handler.dispatchMessage() → Handler.handleMessage()
代码示例
java// 主线程Handler Handler mainHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { // 处理消息,更新UI } }; // 子线程Handler new Thread(() -> { Looper.prepare(); Handler threadHandler = new Handler() { @Override public void handleMessage(Message msg) { // 处理消息 } }; Looper.loop(); }).start();
Handler内存泄漏问题
原因:
- 非静态内部类持有外部Activity引用
- 延迟消息导致Activity无法被回收
解决方案:
- 使用静态内部类 + WeakReference
- 在Activity销毁时移除所有消息
- 使用Handler的removeCallbacksAndMessages(null)
面试要点
- 主线程Looper在ActivityThread.main()中创建
- Handler.post()和sendMessage()的区别
- Message.obtain()复用消息对象,避免内存分配
- IdleHandler在消息队列空闲时执行