invalidate()、postInvalidate()、requestLayout()区别与联系

一、相同点

  • 都是用来刷新界面的

二、不同点

1、内部调用方法

  • invalidate()和postInvalidate()方法只会调用onDraw()方法
  • requestLayout()只会调用当前view的onMeasure和onLayout,当view的位置发生改变才会执行onDraw方法,因此如果要使当前view重绘需要调用invalidate

2、调用线程

  • invalidate()只会在UI线程调用(需要配合Handler使用)
  • postInvalidate()可以在非UI线程中调用

3、内部实现

  • 调用了invalidate方法后,为该View添加一个标记位,同时不断向父容器请求刷新,父容器通过计算得出自身需要重绘的区域,直到传递到ViewRootImpl中,最终触发performTraversals方法,开始View树重绘流程(只绘制需要重绘的视图)
  • 调用requestLayout方法,标记当前View及父容器,requestLayout()事件逐层向上传递,直到DecorView,DecorView传递给ViewRootImpl,ViewRootImpl#requestLayout()接收并处理该事件【最终走到这个方法ViewRootImpl.scheduleTraversals()】。ViewRootImpl会调用三大流程,从measure开始,对于每一个含有标记位的view及其子View进行测量onMeasure、布局onLayout、绘制onDraw

三、参考资料

安卓invalidate()、postInvalidate()、requestLayout()源码分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值