设为首页 加入收藏

TOP

Android的postOnAnimation分析
2014-11-24 07:20:55 来源: 作者: 【 】 浏览:1
Tags:Android postOnAnimation分析

public void postCallbackDelayed(int callbackType,
Runnable action, Object token, long delayMillis) {
if (action == null) {
throw new IllegalArgumentException("action must not be null");
}
if (callbackType < 0 || callbackType > CALLBACK_LAST) {
throw new IllegalArgumentException("callbackType is invalid");
}

postCallbackDelayedInternal(callbackType, action, token, delayMillis);
}

可见最终的实现是在postCallbackDelayedInternal里面,看一下postCallbackDelayedInternal的代码:

private void postCallbackDelayedInternal(int callbackType,
Object action, Object token, long delayMillis) {
if (DEBUG) {
Xlog.d(TAG, "PostCallback: type=" + callbackType
+ ", action=" + action + ", token=" + token
+ ", delayMillis=" + delayMillis + ",this = " + this);
}
synchronized (mLock) {
final long now = SystemClock.uptimeMillis();
final long dueTime = now + delayMillis;
mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token);

if (dueTime <= now) {
scheduleFrameLocked(now);
} else {
Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_CALLBACK, action);
msg.arg1 = callbackType;
msg.setAsynchronous(true);
mHandler.sendMessageAtTime(msg, dueTime);
}
}
}

可以看到在postCallbackDelayedInternal里,在mCallbackQueues队列里面的callbackType添加一个元素。mCallbackQueues是一个CallbackQueue,从命名里就可以看出现,是一个用于回调的队列,并且是安时间先后顺序排好的,与闹钟原理一样,并且里面有一个CallbackRecord类,记录回调相关的信息。callbackType的类型有三种:CALLBACK_INPUT、CALLBACK_ANIMATION、CALLBACK_TRAVERSAL,这里我们用的是CALLBACK_ANIMATION。在postOnAnimation没有delay,所以只要收到Vsync信号,便立即会被执行 。当有Vsync到来是,会执行doFrame,doFrame里有:

...

doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);


doCallbacks里面有如下语句:


...

callbacks = mCallbackQueues[callbackType].extractDueCallbacksLocked(now);


...

try {
for (CallbackRecord c = callbacks; c != null; c = c.next) {
if (DEBUG) {
Xlog.d(TAG, "RunCallback: type=" + callbackType
+ ", action=" + c.action + ", token=" + c.token
+ ", latencyMillis=" + (SystemClock.uptimeMillis() - c.dueTime)
+ ",this = " + this);
}
c.run(frameTimeNanos);
}
} finally {


...

doCallbacks遍历postCallbackDelayedInternal里面添加的元素,并执行元素里的run函数,整个流程也就跑了一遍。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇pcDuino + BusyBox 成功搭建最小L.. 下一篇pcDuino的U-Boot移植与分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)
·有没有Java swing教 (2025-12-25 15:19:09)
·Start, Stop, and Di (2025-12-25 14:50:57)
·C语言入门教程:零基 (2025-12-25 14:50:54)