【Android】Handler/Looper机制相关的类图和流程图

136 阅读1分钟

Handler/Looper 核心类图

classDiagram
    class Looper {
        +static final ThreadLocal~Looper~ sThreadLocal
        +static prepare()
        +static prepareMainLooper()
        +static loop()
        +static myLooper()
        +static getMainLooper()
        +quit()
        +quitSafely()
        -MessageQueue mQueue
        -Thread mThread
        -boolean mInLoop
        +getQueue() MessageQueue
        +setMessageLogging(Printer printer)
    }

    class MessageQueue {
        +Message mMessages
        +boolean enqueueMessage(Message msg, long when)
        +Message next()
        +void quit(boolean safe)
        -long mPtr
        -boolean mQuitting
        -IdleHandler[] mIdleHandlers
        +addIdleHandler(IdleHandler handler)
        +removeIdleHandler(IdleHandler handler)
    }

    class Message {
        +int what
        +int arg1
        +int arg2
        +Object obj
        +Handler target
        +Runnable callback
        +long when
        +Message next
        +Bundle data
        +static Message obtain()
        +void sendToTarget()
        +void recycle()
    }

    class Handler {
        +Handler()
        +Handler(Looper looper)
        +Handler(Callback callback)
        +handleMessage(Message msg)
        +sendMessage(Message msg) boolean
        +sendMessageDelayed(Message msg, long delayMillis) boolean
        +post(Runnable r) boolean
        +obtainMessage() Message
        +dispatchMessage(Message msg)
        -Looper mLooper
        -MessageQueue mQueue
        -Callback mCallback
    }

    class Handler_Callback {
        <<interface>>
        +handleMessage(Message msg) boolean
    }

    class MessageQueue_IdleHandler {
        <<interface>>
        +queueIdle() boolean
    }

    class ThreadLocal~T~ {
        +T get()
        +void set(T value)
    }

    Looper --> MessageQueue : 持有
    Looper --> ThreadLocal : 使用
    MessageQueue --> Message : 管理链表
    Handler --> Looper : 关联
    Handler --> MessageQueue : 通过Looper间接持有
    Handler --> Handler_Callback : 可选回调
    Handler --> Message : 创建和发送
    Message --> Handler : target指向
    MessageQueue --> MessageQueue_IdleHandler : 空闲处理

Handler/Looper 工作流程图

flowchart TD
    A[Handler发送消息] --> B[handler.sendMessage/post]
    B --> C[MessageQueue.enqueueMessage]
    C --> D[按时间排序插入消息队列]
    D --> E[Looper.loop循环]
    
    E --> F[MessageQueue.next]
    F --> G{有消息或未退出?}
    G -->|是| H[取出消息]
    G -->|否| I[线程结束]
    
    H --> J[msg.target.dispatchMessage]
    J --> K{msg.callback存在?}
    K -->|是| L[执行Runnable.run]
    K -->|否| M{mCallback存在?}
    M -->|是| N[执行mCallback.handleMessage]
    M -->|否| O[执行handler.handleMessage]
    
    L --> P[消息回收recycle]
    N --> P
    O --> P
    P --> E

详细时序图

sequenceDiagram
    participant App as 应用程序
    participant Thread as 线程
    participant Looper
    participant MessageQueue
    participant Handler
    participant Message

    App->>Thread: 创建线程
    Thread->>Looper: Looper.prepare()
    Looper->>Looper: 创建Looper实例
    Looper->>MessageQueue: 创建MessageQueue
    Looper->>ThreadLocal: sThreadLocal.set(looper)
    
    Thread->>Handler: 创建Handler
    Handler->>Looper: Looper.myLooper()
    Handler->>MessageQueue: 通过Looper获取mQueue
    
    Thread->>Looper: Looper.loop()
    loop 消息循环
        Looper->>MessageQueue: next()
        MessageQueue-->>Looper: 返回Message
        Looper->>Handler: msg.target.dispatchMessage(msg)
        Handler->>Handler: handleMessage(msg)
        Handler->>Message: recycleUnchecked()
    end

关键类说明

1. Looper 核心职责

  • 线程单例: 通过ThreadLocal保证每个线程只有一个Looper
  • 消息循环: loop()方法无限循环从MessageQueue取消息
  • 主线程准备: prepareMainLooper()为主线程准备Looper

2. MessageQueue 核心功能

  • 消息队列: 按时间顺序维护Message链表
  • Native支持: 使用mPtr指向Native层的MessageQueue
  • 空闲处理: 支持IdleHandler在队列空闲时执行

3. Handler 消息处理

  • 消息发送: sendMessage(), post()等方法
  • 消息分发: dispatchMessage()决定消息处理路径
  • 线程切换: 实现跨线程通信

4. Message 消息对象

  • 对象池: 使用obtain()从对象池获取,避免频繁创建
  • 目标指向: target字段指向处理该消息的Handler
  • 数据载体: what, arg1, arg2, obj, data等多种数据存储方式

设计要点

  1. 线程隔离: 每个线程有独立的Looper和MessageQueue
  2. 对象复用: Message对象池减少GC压力
  3. 时间排序: 消息按执行时间排序,支持延时消息
  4. 安全退出: quitSafely()确保所有消息处理完再退出
  5. 空闲优化: IdleHandler机制充分利用CPU空闲时间

这套机制是Android异步编程的核心基础,理解它对性能优化和问题排查都有重要意义。