在手指绘图的示例app方法中,我们可以了解到invalidate方法的调用,每调用一次,会通过Choreographer注册一次Vsycn信号回调,作为绘图onDraw调用的触发。由于是post请求,所以这里不会被阻塞住。
观察onTouchEvent和onDraw里的log,我们可以发现,都是主线程,也就是说都是在UI线程中执行的,这就表示,onTouchEvent和onDraw同时作为主线程中的动作,是会相互影响,抢占执行资源。这里又有个概念出来了,设置同步屏障,可以让绘制有更高的优先级。
为什么input事件的分发也走到了主线程呢?因为InputChannel在app端的fd被加入到了主线程Loop的epoll监控fd中了(Looper::addFD方法),经过一系列复杂的操作处理,input事件就回调到主线程里了,
这里的水很深,掺杂了loop的底层核心内容,了解大致流程后再看处理细节会容易理解一些。可参考InputChannel的相关资料。
调用到WindowInputEventReceiver的onInputEvent方法后,后面还有一些复杂的处理,
可参考
final class WindowInputEventReceiver extends InputEventReceiver {
public WindowInputEventReceiver(InputChannel inputChannel, Looper looper) {
super(inputChannel, looper);
}
@Override
public void onInputEvent(InputEvent event) {
<!--关键点 最后一个参数是true-->
enqueueInputEvent(event, this, 0, true);
}