美文网首页
学习计划:2021-06-28

学习计划:2021-06-28

作者: yangSmallXing | 来源:发表于2021-06-28 12:47 被阅读0次

view.post()
使用场景
有时候使用view.getWidth()返回是0,因为这时候view还没被绘制出来。使用view.post(new Runnble)可以在view绘制完成后,在runnable里面获得view的宽高。
原理

public boolean post(Runnable action) {
    
    // ...
    
    // 判断AttachInfo是否为null
    final AttachInfo attachInfo = mAttachInfo;

    // 若不为null,直接调用其内部Handler的post ->>
    if (attachInfo != null) {
        return attachInfo.mHandler.post(action);
    }

    // 若为null,则加入当前View的等待队列
    getRunQueue().post(action); 
    return true;
}

AttachInfo在view.dispatchAttachedToWindow()方法中被赋值,所以在Activity的onCreate()方法中,AttachInfo为空,只是把runnable添加到view的队列中。

public void postDelayed(Runnable action, long delayMillis) {
    // 将传入的任务runnable封装成HandlerAction  
    final HandlerAction handlerAction = new HandlerAction(action, delayMillis);

    synchronized (this) {
        // 将要执行的HandlerAction 保存在 mActions 数组中
        if (mActions == null) {
            mActions = new HandlerAction[4];
        }

        mActions = GrowingArrayUtils.append(mActions, mCount, handlerAction);
        mCount++;
    }
}

把runnable封装成HandlerAction ,并且保存在mActions 数组中,当

public void executeActions(Handler handler) {
    synchronized (this) {
        
        final HandlerAction[] actions = mActions;
        // 遍历所有任务
        for (int i = 0, count = mCount; i < count; i++) {
            final HandlerAction handlerAction = actions[i];
            // 发送到Handler中,等待执行
            handler.postDelayed(handlerAction.action, handlerAction.delay);
        }

        // 此时不再需要后续的post,将被添加到AttachInfo中
        mActions = null;
        mCount = 0;
    }

当view绘制完成后,遍历所有的任务,执行任务

View.post() 添加的任务能够保证在所有 View绘制流程结束之后才被执行,所以 执行View.post() 添加的任务时可以正确获取到 View 的宽高。

相关文章

  • 学习计划:2021-06-28

    view.post()使用场景有时候使用view.getWidth()返回是0,因为这时候view还没被绘制出来。...

  • 突如其来的大雨

    2021-06-28 阴有雨 周一 中午1:28分,我在闹铃中醒了过来。 “不是吧?”起床一看窗...

  • 2021-07-04 思考成长周复盘

    一 时间 2021-06-28 ~ 2021-07-04 二 围绕精力提升所做的事情 简书日更写作 低脂纯素饮食,...

  • 有了小宝该不该放弃大宝?

    2021-06-28 这个故事主要是讲养孩子和养宠物不矛盾! ! 大宝原名叫“宝宝”,是菲菲(化名)从学校里收养的...

  • 【餐饮100问】29.辞职干餐饮行吗?

    Day240 2021-06-28 晚上去小姐妹店里去做护肤,说起来她男朋友想要辞职去干餐饮,想让我给他说说,主要...

  • 计划汇总

    lintcode计划 the war of art翻译计划 《机器学习》西瓜书学习计划

  • 以后要有规划的生活啊

    计划看书 计划学习编程 计划学习英语 计划运动 计划涂鸦 光是想一想就很兴奋呢

  • 能找到适合自己的方法最重要

    2021-06-28 之前跑步运动打卡,但是身形不见瘦,总是保持一成不变。 有好长一段时间了,体重一直保持在63....

  • 金三角投喂点和要领

    2021-06-28 金三角这里大大小小常驻加常来将近20只猫。统一要点: 一,防治野狗骚扰:一共有6个位置。为了...

  • 尽信书则不如无书

    日记851篇 2021-06-28 很多人想着,打工时做一天和尚撞一天钟,等自己创业时,再发力也不迟。这样想,就错...

网友评论

      本文标题:学习计划:2021-06-28

      本文链接:https://www.haomeiwen.com/subject/dxsqultx.html