View.post原理总结

  1. 从安卓7.0 系统(API24)开始View#post还是比较好理解的,简单来说就是当该View被attach到某个Window过才会执行该View post的Runnable中的代码。如果调用post的时候该View已经附加到某个Window上,那么会将Runnable post到UI线程中,如果调用post的时候该View还未被添加到任何Window中,那么会将其存储起来,等待附加的时候执行。所以如果post某个Runnable,但是从未将该View添加到某个窗口中,那么该Runable中的代码将永远不会被执行。注意这和7.0以下的永远不被执行的情况不同,这种情况是符合常理的,因为可以认为一个不依附任何Window的View是没有意义的,此时它只是一个简单的java类,不应该具备视图的功能。
  2. 对于7.0以下系统:当调用post时如果该View已经attach到了某个Window上,此时和7.0系统处理逻辑是一样的;如果调用post的时候该View还未被添加到任何Window中,那么会将Runnable存储起来,等待下一次执行performTraversals时执行,如果post是在子线程中调用的,那么其方法体中的代码将永远不会被执行,如果是在UI线程中调用的那么会在下一次performTraversals时执行。所以在7.0以下系统一定要注意确保View被attach到某个Window之后,在调用其post方法,否则post的Runnable中的代码很可能不会执行,尤其是如果post在子线程中调用那么可以肯定永远不会执行。
  3. 当View被attach到某个Window上后,其效果等同于Handler#post,此时2者可以认为等价

总结自:你真的会用View的post方法吗

可能,你还想了解View.dispatchAttachedToWindow和ViewRootImpl.performTraversals

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值