对比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 实现支撑。流程如下:
Java 调用 MessageQueue.nativeInit() 初始化消息队列;
会在 Native 层创建:
nativeInit() → new NativeMessageQueue() → Looper::prepare()
此处的 Looper::prepare() 就是创建了 Native 的 Looper 实例,并保存在线程 TLS 中;
当 Java 的 Looper.loop() 进入事件循环,其本质是调用 Native pollOnce() 等待消息或 fd 事件;
Native pollOnce() 使用的是 epoll_wait(),既能监听消息超时,也能监听 Binder 事件、fd 事件(如 VSYNC)。
四、为什么要这样分层?
- Java 层做逻辑调度,适合应用开发;
- Native 层负责高效 IO 多路复用、跨进程事件监听等系统级事件(如输入、VSYNC、Binder 通信)
- 两层通过 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 |