scheduleTraversals(); //开始遍历
}
}
void checkThread() {
//这里检查线程是否是mThread,不是的话就抛出异常,mThread一般是UI线程
if (mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException(“Only the original thread that created a view hierarchy can touch its views.”);
}
}
public boolean mTraversalScheduled;
int mTraversalBarrier;
Choreographer mChoreographer;
void scheduleTraversals() {
if (!mTraversalScheduled) { //不在执行中才执行
mTraversalScheduled = true; //更新标记为执行中
//向mHandler的MessageQueue中添加一个同步屏障,一个同步屏障也是一个Message,但是这个Message的target是null,并且后面会有一个异步消息AsynchronousMessage
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
//这里是重点!!!,通过Choreographer来post一个消息,//TAG1: CALLBACK_TRAVERSAL,要记住这个TAG
mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
…省略部分代码…
}
}
我们先来看MessageQueue.postSyncBarrier():
public int postSyncBarrier() {
//这里使用当前时间作为参数传递进去
return postSyncBarrier(SystemClock.uptimeMillis());
}
private int postSyncBarrier(long when) {
synchronized (this) {
final int token = mNextBarrierToken++; //token增加1
final Message msg = Message.obtain();
msg.markInUse();
msg.when = when; //msg.when就是当前时间
msg.arg1 = token; //arg1就是token
//注意!!!这个msg没有target,也就是msg.target=null
//循环遍历,将这个同步屏障msg插入到队列
Message prev = null;
Message p = mMessages;
//遍历查找when之前的消息
if (when != 0) {
while (p != null && p.when <= when) {
prev = p;
p = p.next;
}
}
//插入到队列
if (prev != null) {
msg.next = p;
prev.next = msg;
} else {
msg.next = p;
mMessages = msg;
}
return token;
}
}
再来看看removeSyncBarrier():
//这个to