【Android】从UI刷新的invalidate到input loop的知识链

在手指绘图的示例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方法后,后面还有一些复杂的处理,

可参考

Android GPU呈现模式原理及卡顿掉帧浅析 - 简书

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);
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值