您当前的位置: 首页 > 
  • 0浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

handler相关学习(三)handler必背

沙漠一只雕得儿得儿 发布时间:2021-03-27 11:20:21 ,浏览量:0

问题一、Android-Handler同步屏障,消息机制之同步屏障

https://www.jianshu.com/p/2fb96d4e0cd5

Handler设置同步屏障之后可以拦截Looper对同步消息的获取和分发。加入同步屏障之后,Looper只会获取和处理异步消息,如果没有异步消息会进入阻塞状态。

消息机制的同步屏障,其实就是阻碍同步消息,只让异步消息通过。而开启同步屏障的方法就是调用下面的方法:

MessageQueue#postSyncBarrier()

创建同步消息的源码如下:

@TestApi
public int postSyncBarrier() {
    // 这里传入的时间是从开机到现在的时间戳
    return postSyncBarrier(SystemClock.uptimeMillis());
}
/**
 * 这就是创建的同步屏障的方法
 * 同步屏障就是一个同步消息,只不过这个消息的target为null
 */
private int postSyncBarrier(long when) {
    // Enqueue a new sync barrier token.
    // We don't need to wake the queue because the purpose of a barrier is to stall it.
    synchronized (this) {
        final int token = mNextBarrierToken++;
        // 从消息池中获取Message
        final Message msg = Message.obtain();
        msg.markInUse();
        // 初始化Message对象的时候,并没有给Message.target赋值,
        // 因此Message.target==null
        msg.when = when;
        msg.arg1 = token;

        Message prev = null;
        Message p = mMessages;
        if (when != 0) {
            // 这里的when是要加入的Message的时间
            // 这里遍历是找到Message要加入的位置
            while (p != null && p.when             
关注
打赏
1657159701
查看更多评论
0.0530s