Choreographer中postFrameCallback的调用时机
当下一个Vsync信号来临时,会按照Type取出CallbackQuenes中的链表里面存储的CallBackRecord进行遍历其run方法。
那么什么时机往这个队列中添加回调呢? 在ViewRootImpl中(WMS端收到NativeInputQuene消息回调InputChannel调用到APP端进行ViewRoot分发处理)会调用postFrameCallback方法,这个方法会传入一个FrameCALLback,并将默认使用ANIMATION动画这个回调Type和TOKEN为FRAMETOKEN的token标识来创建一个CallbackRecord并将其添加到对应动画Callback对应的链表中。
在ViewRoot.setView中进行初始化InputChannel和WMS端的InputChannel
流程
ViewRoot的setView方法构造APP端InputChannel对象–>
WindowSession将APP端创建出来的InPUTChannel对象传入到WMS端–>
WMS端进行初始化WMS的InputChannel,申请共享内存并把文件描述符给到APP端的InputChannel对象–>
WMS的InputChannel指向一个fd,而APP端的InputChannel也指向一个fd.这两个后面会进行全双工通信–>
WMS创建两个线程一个ThreadReader读取EventHub(该现场有拦截无用事件的功能并添加到待处理事件队列中),一个ThreadDispatcher用于取出待处理事件队列(对事件进行预处理,设置焦点等)何时进行分发?当上一个事件处理完成之后才会进行分发.(分发过程是将该事件写入到共享内存中,并使用WMS的InputChannel通知APP端的InputChannel【利用初始化时保存的fdpipe通信唤醒】)–>APP端
APP端–>InputChannel从共享内存中拿到事件,InputChannel将事件传递到ViewRoot中,ViewRoot拿着
DecoeView.之后按照Java‘中的事件分发进行处理’
type:这个的用处是下一个Vsync信号来临时,首先会按照TYPE来取出对应的链表,然后进行调用run方法【具体调用哪个方法根据token确定】,接着在取出下一个TYPE如此往复,。固定顺序为:
INPUT 输入处理 Animation,动画处理 Traversal 最终会调用到perfor的measure,layout,draw方法 Commit
token :这个用来表示是否是FrameCallBacl类型的回调还是普通的CallBack,上面的说法其实有点偏,并不是所有CallBack都是调用其run方法,根据其token来决定。
比如这部分讲解的postFrameCallback在Choreographer中会将其转换为FrameCallback的Token和ANIMATION的Callback的type,而像其他的postCallBacl则会具体指定其对应的CallBackType和token是null。
对于FrameCallBacl类型的Callbackl调用其doFrame方法,对于普通的回调CallBacak调用其run方法)【一个很明显的区别是普通的CallBack传入的是一个Runnable最终会调用这个run方法,而对于FrameCallback来说则会调用其doFrame方法。】
对于postFrameCallBack方法的流程图:
【这里提个建议,希望markdown能够支持闪念笔记的流程图格式】
代码语言:javascript复制postFrameCallBack方法传入FrameCallback
Choregapher中会将其封装成ANIMATION_Type的Callback和FrameCallback的Token
将其封装成一个CallBackRecord放到对应Type的链表中等待下一个Vsync回调-
Vsync回调来了
按照固定TYPE的顺序取出对应的链表调用CallbackRecord的run方法
CallBackRecord的run方法
取出token发现为FrameCallback__接着回调接口的doFrame方法
由于postFrameCallBack发送的Callback是ANIMATION的类型CallbackRecord,所以doFrame方法是在处理动画过程中进行调用的,在这个方法里面又进行了添加TRAVERSAL的TYPECallbackRecord,并接着再次注册下一个处理动画的回调。 而对于普通的这种比如TRAVERSAL则是必须要指明其对应type类型和token为null,否则默认会是ANIMATION类型并且是FRAMECALLBACLK的token。
本次ANIMATION处理:发送TRAVERSAL和ANIMATON的回调。
TRAVERSAL会进入到View的measure,layout,draw方法。Vsync之后会单独拿出一节来讲
ANIMATON会执行动画处理