对比Java层的Looper

Native 层的 android::Looper 与 Java 层的 android.os.Looper 虽然名字相同,但它们本质上是两个不同层级的实现,分别服务于:

  • Native 层(C++)的事件循环和 fd 监听
  • Java 层(Java)通过 Handler 处理消息(Message)

不过它们之间是有关联的,核心在于:

Java 层的 Looper 内部最终是基于 Native 层 Looper 和 epoll 实现的消息等待机制。

下面我们详细展开它们的联系:

一、两者的职责对比

层级 类名 职责说明
Java 层 android.os.Looper 管理 Java 层的 MessageQueue,与 Handler 配合
Native 层 android::Looper 管理 Native 层的 fd 事件监听和回调(基于 epoll)

二、Java 层Looper是怎么工作的?

Java 层的消息循环是这样构建的:

public class Looper {
    static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>();

    final MessageQueue mQueue;

    private Looper() {
        mQueue = new MessageQueue(...); // native层创建的
    }

    public static void prepare() {
        sThreadLocal.set(new Looper());
    }

    public static void loop() {
        Looper me = myLooper();
        for (;;) {
            Message msg = me.mQueue.next();  // ← 关键:这里会阻塞等待消息
            ...
        }
    }
}

关键在这句:

Message msg = queue.next();

这背后调用了 Native 层的 nativePollOnce(),也就是:

android_os_MessageQueue_nativePollOnce()
 → Looper::pollOnce()
 → epoll_wait(...)

三、JavaMessageQueue与NativeLooper的连接点

Java 层的 MessageQueue 实际由 Native 实现支撑。流程如下:

  1. Java 调用 MessageQueue.nativeInit() 初始化消息队列;

  2. 会在 Native 层创建:

    nativeInit() → new NativeMessageQueue() → Looper::prepare()

  3. 此处的 Looper::prepare() 就是创建了 Native 的 Looper 实例,并保存在线程 TLS 中;

  4. 当 Java 的 Looper.loop() 进入事件循环,其本质是调用 Native pollOnce() 等待消息或 fd 事件;

  5. Native pollOnce() 使用的是 epoll_wait(),既能监听消息超时,也能监听 Binder 事件、fd 事件(如 VSYNC)。

四、为什么要这样分层?

  1. Java 层做逻辑调度,适合应用开发;
  2. Native 层负责高效 IO 多路复用、跨进程事件监听等系统级事件(如输入、VSYNC、Binder 通信)
  3. 两层通过 JNI 连接,但最终都依赖 Native Looper 的 epoll_wait

五、典型联系实例:VSYNC 驱动 UI

  • Choreographer(Java)通过 DisplayEventReceiver → 使用 Native Looper 添加 fd;
  • 当 VSYNC 到来,触发 Native 层 handleEvent();
  • 回调 Java 方法 onVsync() → 触发下一帧绘制。

六、总结关键点

项目 **Java **Looper **Native **Looper
管理对象 Java MessageQueue epoll + fd 监听 + 回调
调用入口 Looper.loop() Looper::pollOnce()
fd监听能力 无(不支持) 支持 (addFd() / epoll)
与线程绑定 ThreadLocal<Looper> pthread_key_create TLS
关联方式 Java MessageQueue 使用 Native Looper nativeInit() 时构建 Native Looper
案例 Handler、Choreographer DisplayEventReceiver、Binder

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器