Appearance
looper-handler-demo
1. 实验目标
用最小 Android 实现验证主线程消息循环机制(对应 docs/01-runtime-concurrency/13):
- Handler + MessageQueue:消息先入队,由 Looper 逐条取出执行(入队 ≠ 立即执行)
- 延迟消息:
postDelayed的消息按when时间排序,先发的不一定先执行 - HandlerThread:子线程自带 Looper,后台串行处理任务
- 子线程 → 主线程回传:通过主线程 Handler
sendMessage安全更新 UI
2. 工程要点
- 主线程
Handler(Looper.getMainLooper()):handleMessage里更新日志 HandlerThread("DemoWorker"):start()后Handler(workerThread.looper)获得子线程 handler- 观察
postDelayed顺序:A(0ms) → C(0ms) → B(100ms),验证 MessageQueue 按时间排序 onDestroy必须workerThread.quitSafely(),否则子线程 Looper 泄漏
3. 运行方式
bash
cd labs/android/host
./gradlew installDebug设备/模拟器打开 Android Host → 打开 Looper / Handler 消息循环实验室。
4. 预期现象
- "发消息":日志依次显示 msg1/2/3 按入队顺序执行
- "延迟消息":A → C → B(B 因 100ms 延迟排到队尾)
- "子线程任务":3 个任务串行执行(每个 300ms),完成后逐个回传主线程日志
5. 常见误区
| 误区 | 实际情况 |
|---|---|
sendMessage 立即执行 | 只是入队,真正执行取决于 Looper 从队列取出的时机 |
| 子线程可以直接更新 UI | 必须通过主线程 Handler(或 runOnUiThread)回传 |
HandlerThread 用完不回收 | 不 quitSafely() 会永久占用一条线程 |