private Choreographer(Looper looper, int vsyncSource) { //记录looper mLooper = looper; //定义Handler接收message mHandler = new FrameHandler(looper); //定义DisplayEventReceiver子类,用来接送底层刷新信号 mDisplayEventReceiver = USE_VSYNC ? new FrameDisplayEventReceiver(looper, vsyncSource) : null;; //内部队列,用来维护各种请求,比如Traversal callback mCallbackQueues = new CallbackQueue[CALLBACK_LAST + 1]; for (int i = 0; i <= CALLBACK_LAST; i++) { mCallbackQueues[i] = new CallbackQueue(); } }
放入队列:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Choreographer.java private void postCallbackDelayedInternal(int callbackType, Object action, Object token, long delayMillis) { synchronized (mLock) { final long now = SystemClock.uptimeMillis(); final long dueTime = now + delayMillis; //放入队列 mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token);
DisplayEventReceiver.java public void scheduleVsync() { if (mReceiverPtr == 0) { Log.w(TAG, "Attempted to schedule a vertical sync pulse but the display event " + "receiver has already been disposed."); } else { //native 方法,注册同步脉冲信号事件,告诉底层我需要刷新信号了,记得你的刷新时间到了,给我发送信号 //底层每16ms刷新一次,如果上层没有注册同步脉冲信号事件,则底层刷新的时候不会通知上层。 nativeScheduleVsync(mReceiverPtr); } }