如果忘了移除同步屏障-不会阻塞点击

主线程插入同步屏障后忘记移除,点击事件还能响应吗?

点击事件仍然可以响应。

原因详解

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(…)

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