Handler源码分析之二 异步消息的处理,附相关架构及资料

这篇博客深入分析了Android中Handler处理异步消息的过程,包括添加和移除同步屏障的机制。文章通过源码解读展示了如何在消息队列中插入和移除同步屏障,并探讨了Choreographer类的角色,如何调度回调以执行布局、测量和绘制操作。此外,还讨论了FrameHandler和FrameDisplayEventReceiver如何协同工作,确保正确的帧同步。
摘要由CSDN通过智能技术生成

//循环遍历,将这个同步屏障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():

//这个token就是我们上面保存的
public void removeSyncBarrier(int token) {
synchronized (this) {
//遍历删除这个token对应的msg
Message prev = null;
Message p = mMessages;
//只要p.target!=null || p.arg1!=token就一直找,因为上面我们分析了同步屏障的target=null,并且arg1=token
while (p != null && (p.target != null || p.arg1 != token)) {
prev = p;
p = p.next;
}
//检测队列
if (p == null) {
throw new IllegalStateException("The specified message queue synchronization "

  • " barrier token has not been posted or has already been removed.");
    }
    final boolean needWake;
    //移除同步屏障消息
    if (prev != null) {
    prev.next = p.next;
    needWake = false;
    } else {
    mMessages = p.next;
    needWake = mMessages == null || mMessages.target != null;
    }
    //回收
    p.recycleUnchecked();

//如果需要唤醒,则唤醒等待
if (needWake && !mQuitting) {
nativeWake(mPtr);
}
}
}

然后看mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);第一个参数是个int,第二个参数mTraversalRunnable是个Runnable,代码如下:

final TraversalRunnable mTraversalRunnable = new TraversalRunnable();
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}

void doTraversal() {
if (mTraversalScheduled) { //不在执行中才执行
mTraversalScheduled = false; //更新标记为执行中
//从mHandler的MesssageQueue中移除同步屏障,还记得刚刚添加同步屏障的代码吗
mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
//开始遍历布局
performTraversals();
}
}

//这个方法对view进行了测量,布局和绘制,我们后面会细讲
private void performTraversals() {

performMeasure();

performLayout();

performDraw();

}<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值