乐闻世界logo
搜索文章和话题

Android中Handler机制的工作原理是什么?

3月7日 12:13

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无法被回收

解决方案

  1. 使用静态内部类 + WeakReference
  2. 在Activity销毁时移除所有消息
  3. 使用Handler的removeCallbacksAndMessages(null)

面试要点

  • 主线程Looper在ActivityThread.main()中创建
  • Handler.post()和sendMessage()的区别
  • Message.obtain()复用消息对象,避免内存分配
  • IdleHandler在消息队列空闲时执行
标签:Android