Handler源码分析之二 异步消息的处理,kotlin实现单例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值