- private void scheduleFrameLocked(long now) {
- ...
- //先断定当前是不是在UI线程
- if (isRunningOnLooperThreadLocked()) {
- scheduleVsyncLocked();
- //是UI线程就请求一个Vsync旌旗灯号
- } else {
- Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_VSYNC);
- msg.setAsynchronous(true);
- mHandler.sendMessageAtFrontOfQueue(msg);
- //不在UI线程向FrameHandler发送一个MSG_DO_SCHEDULE_VSYNC消息
- //来请求一个Vsync旌旗灯号
- }
- }
- private void scheduleVsyncLocked() {
- mDisplayEventReceiver.scheduleVsync();
- //经由过程DisplayEventReceiver请求一个Vsync旌旗灯号
- //这是个恨角色,待会儿会聊聊它。
- //MSG_DO_SCHEDULE_VSYNC消息也是经由过程调用这个办法请求Vsync旌旗灯号的。
- }
膳绫擎我们提到过,Choreographer在一个线程中只有一个。所以,如不雅在其它线程,须要经由过程Handler来切换到UI线程,然后再请求Vsync旌旗灯号。
下面看看方才出场的mDisplayEventReceiver是个什么鬼?
- private final class FrameDisplayEventReceiver extends DisplayEventReceiver
- implements Runnable {
- //这个办法用于接收Vsync旌旗灯号
- public void onVsync(){
- ...
- Message msg = Message.obtain(mHandler, this);
- msg.setAsynchronous(true);
- mHandler.sendMessageAtTime(msg, timestampNanos / TimeUtils.NANOS_PER_MS);
- //这里并没有设置消息的类型
- //其实就是默认为0,即MSG_DO_FRAME类型的消息
- //它其实就是通知Choreographer开端回调CallbackQueue[]中的Callback了
- //也就是开端绘制下一帧的内容了
- }
- //这个办法是在父类中的,写在这便利看
推荐阅读
当我第一次收到银行发来的“安然”邮件时,我第一反竽暌功就是这里是否有诈?因为在我看来,它实袈溱是太像垂纶邮件了。这封躺在收件箱里的邮件来源竽暌冠我银行经理的小我邮箱地>>>详细阅读
本文标题:用两张图告诉你,为什么你的App会卡顿?
地址:http://www.17bianji.com/lsqh/35508.html
1/2 1