如果忘了移除同步屏障-不会阻塞点击
主线程插入同步屏障后忘记移除,点击事件还能响应吗?
点击事件仍然可以响应。
原因详解
1. 输入事件的派发机制不是通过普通同步消息发送,而是通过 **Choreographer.CALLBACK_INPUT安排的异步执行。
2. Choreographer的回调是通过**Message.setAsynchronous(true)**标记的:
Message msg = Message.obtain();
msg.setAsynchronous(true);
这意味着:
即使存在同步屏障,CALLBACK_INPUT 回调不会被阻塞,因为它是异步消息!
3. View 的点击事件(如dispatchTouchEvent)是在这个异步回调中执行的:
- 即便同步屏障存在,事件依然在 CALLBACK_INPUT 中被处理
- 所以点击事件 不会 因为同步屏障而“卡住”
验证方式(实验代码)
Looper.myQueue().postSyncBarrier();
button.setOnClickListener(v -> Log.d("TEST", "clicked")); // 是可以响应的!
你会看到日志被打印,说明事件响应正常。
之前回答为何说会阻塞?
这是因为有些资料/讲解基于 假设“事件由同步消息发送”,但真实的 Android 事件处理(从 API 16 开始)早已通过 Choreographer 统一调度,属于异步执行链路。
总结
问题 | 答案 |
---|---|
忘记移除同步屏障是否会阻塞点击事件? | 不会阻塞 |
原因 | 点击事件通过 Choreographer.CALLBACK_INPUT 作为异步消息执行,不受屏障影响 |
会阻塞哪些消息? | 同步消息,如普通 handler.sendMessage(…) |