安卓笔记—调用栈之从vsync到onTouchEvent以及MotionEvent从哪里来

相关阅读:矢山代码阅读器

从onTouchEvent向上搜索

android.view.ViewRootImpl.ConsumeBatchedInputRunnable.run:::
android.view.ViewRootImpl.doConsumeBatchedInput::long:
android.view.ViewRootImpl.doProcessInputEvents:::
android.view.ViewRootImpl.deliverInputEvent::ViewRootImpl.QueuedInputEvent:
android.view.ViewRootImpl.InputStage.deliver::ViewRootImpl.QueuedInputEvent:
android.view.ViewRootImpl.InputStage.onProcess::ViewRootImpl.QueuedInputEvent:#-override
android.view.ViewRootImpl.ViewPostImeInputStage.onProcess::ViewRootImpl.QueuedInputEvent:
android.view.ViewRootImpl.ViewPostImeInputStage.processPointerEvent::ViewRootImpl.QueuedInputEvent:
android.view.View.dispatchPointerEvent::MotionEvent:
android.view.View.dispatchTouchEvent::MotionEvent:
android.view.View.performOnTouchCallback::MotionEvent:
android.view.View.onTouchEvent::MotionEvent:

ConsumeBatchedInputRunnable继承自Runnbale,只有一个实例:ViewRootImpl.mConsumedBatchedInputRunnable,那么下一步就是搜索数据流动,但是他的数据流动与ViewRootImpl.mTraversalRunnable的一模一样,因此不在这里重复了。请阅读 调用栈之从vsync到ondraw 查看ViewRootImpl.mTraversalRunnable的数据流。

MontionEvent从哪里来

从onTouchEvent::MotionEvent:event向上搜索,

// 在函数:android.view.ViewRootImpl.doProcessInputEvents::: 中使用 mPendingInputEventHead
android.view.ViewRootImpl.mPendingInputEventHead
android.view.ViewRootImpl.QueuedInputEvent-reference
android.view.ViewRootImpl.QueuedInputEvent.mNext
android.view.ViewRootImpl.deliverInputEvent::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.InputStage.deliver::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.InputStage.onProcess::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.ViewPostImeInputStage.onProcess::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.ViewPostImeInputStage.processPointerEvent::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.QueuedInputEvent-reference
android.view.ViewRootImpl.QueuedInputEvent.mEvent
android.view.View.dispatchPointerEvent::MotionEvent:event
android.view.View.dispatchTouchEvent::MotionEvent:event
android.view.View.performOnTouchCallback::MotionEvent:event
android.view.View.onTouchEvent::MotionEvent:event

ViewRootImpl.mPendingInputEventHead有两个数据来源

来源1

// 从这里向上再没有找到哪个函数在调用他了
android.view.Window.injectInputEvent::InputEvent:event
com.android.internal.policy.PhoneWindow.injectInputEvent::InputEvent:event
android.view.ViewRootImpl.dispatchInputEvent::InputEvent:event
android.view.ViewRootImpl.dispatchInputEvent::InputEvent,InputEventReceiver:event
android.os.Handler.obtainMessage::int,Object:return#
android.os.Handler.sendMessage::Message:return#
android.view.ViewRootImpl.ViewRootHandler-reference
android.view.ViewRootImpl.mHandler
// msg:MSG_DISPATCH_INPUT_EVENT
android.view.ViewRootImpl.ViewRootHandler.handleMessage::Message:msg
android.view.ViewRootImpl.ViewRootHandler.handleMessageImpl::Message:msg
android.os.Message-reference
android.os.Message.obj
android.view.ViewRootImpl.enqueueInputEvent::InputEvent,InputEventReceiver,int,boolean:event
android.view.ViewRootImpl.obtainQueuedInputEvent::InputEvent,InputEventReceiver,int:return
android.view.ViewRootImpl.mPendingInputEventHead

来源2

// Called from native code.
android.view.InputEventReceiver.dispatchInputEvent::int,InputEvent:event
android.view.InputEventReceiver.onInputEvent::InputEvent:event
android.view.ViewRootImpl.WindowInputEventReceiver.onInputEvent::InputEvent:event
android.view.ViewRootImpl.enqueueInputEvent::InputEvent,InputEventReceiver,int,boolean:event
android.view.ViewRootImpl.obtainQueuedInputEvent::InputEvent,InputEventReceiver,int:return#
android.view.ViewRootImpl.mPendingInputEventHead

另附文档 Batched consumption
部分原文与翻译:
Most apps draw once per vsync. Therefore, apps can only respond to 1 input event per frame. If multiple input events come in during the period of 1 vsync, it would be wasteful to deliver them all at once to the app. For this reason, input events are batched to only deliver 1 event per frame to the app.
大多数应用每垂直同步绘制一次。因此,应用每帧只能响应 1 个输入事件。如果在 1 个垂直同步期间有多个输入事件,则将它们全部一次性传送给应用会很浪费。因此,输入事件会分批处理,每帧仅向应用传送 1 个事件。

上面这句话对我来说很模糊,既说了“分批处理”,又说了“每帧1个事件”,我没有读懂他到底是怎么个意思。难道意思是每批只有1个事件吗?(显然不是)还需要读代码才能知道。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值