大年夜图中可以看到,每当doTraversal()被调用时,一系列的测量、构造和绘制操作就开端了。在绘制时,会经由过程Surface来获取一个Canvas内存块交给DecorView,用于视图的绘制。全部View视图的内容都是被绘制到这个Canvas中。
Choreographer中的如火如荼
前面反复提到向Choreographer中post回调,那么post页堪产生了些什么呢?大年夜图中可以看到,所有的post操作最终都进入到postCallbackDelayedInternal()中。
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);
- //将Callback添加到CallbackQueue[]中
- if (dueTime <= now) {
- scheduleFrameLocked(now);
- //如不雅回调时光到了,请求一个Vsync旌旗灯号
- //在接收到后会调用doFrame()回调这个Callback。
- } else {
- Message msg = mHandler.obtainMessage(MSG_DO_SCHEDULE_CALLBACK, action);
- msg.arg1 = callbackType;
- msg.setAsynchronous(true);
- //异步消息,避免被拦截器拦截
- mHandler.sendMessageAtTime(msg, dueTime);
- //如不雅还没到回调的时光,向FrameHandelr中发送
- //MSG_DO_SCHEDULE_CALLBACK消息
- }
- }
- ...
- }
膳绫擎这段代码会把post到Choreographer中的Callback添加到Callback[]中,并且当它因该被回调时,请求一个Vsync旌旗灯号,在接收到下一?Vsync旌旗灯号时回调这个Callback。如不雅没有到回调的时光,则向FrameHandler中发送一个MSG_DO_SCHEDULE_CALLBACK消息,但最终照样会请求一个Vsync旌旗灯号,然后回调这个Callback。
简单提一下CallbackQueue:简单说一下CallbackQueue。它和MessageQueue差不多,都是单链表构造。在我的┞封篇【惊天机密!大年夜Thread开端,揭穿Android线程通信的诡计和主线程的诡计http://www.jianshu.com/p/8862bd2b6a29】文┞仿中,你可以或许看到更多关于MessageQueue和Handler机制的内容。不合的是它同时照样一个一维数组,下标表示Callback类型。事实上,算膳绫强种类型的单链表构造,它更像是二维数组的样子。简单点描述,假设有一个MessageQueue[]数组,琅绫擎存了几个MessageQueue。来看看它的创建你可能就明白,它是在Choreographer初始化时创建的。
- private Choreographer(Looper looper) {
- mCallbackQueues = new CallbackQueue[CALLBACK_LAST + 1];
推荐阅读
当我第一次收到银行发来的“安然”邮件时,我第一反竽暌功就是这里是否有诈?因为在我看来,它实袈溱是太像垂纶邮件了。这封躺在收件箱里的邮件来源竽暌冠我银行经理的小我邮箱地>>>详细阅读
本文标题:用两张图告诉你,为什么你的App会卡顿?
地址:http://www.17bianji.com/lsqh/35508.html
1/2 1