postInvalidate postInvalidateOnAnimation 区别

本文详细分析了Android中postInvalidate和postInvalidateOnAnimation的区别。postInvalidate方法将invalidate任务加入队列并立即执行,而postInvalidateOnAnimation则依赖于动画帧率,在下一帧动画时执行刷新操作。通过Choreographer的机制,postInvalidateOnAnimation确保在合适的时机执行,与动画同步。
摘要由CSDN通过智能技术生成

1.先看postInvalidate方法执行过程

    public void postInvalidate() {
        postInvalidateDelayed(0);
    }

    public void postInvalidateDelayed(long delayMilliseconds) {
        // We try only with the AttachInfo because there's no point in invalidating
        // if we are not attached to our window
        final AttachInfo attachInfo = mAttachInfo;
        if (attachInfo != null) {
            attachInfo.mViewRootImpl.dispatchInvalidateDelayed(this, delayMilliseconds);
        }
    }
public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {
        Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view);
        mHandler.sendMessageDelayed(msg, delayMilliseconds);
    }

从代码中看出,调用postInvalidate方法后,会用mHandler发出一条延迟消息MSG_INVALIDATE,这里延时为0(没有主动调用postInvalidateDelayed的话)。
再看mHandler的执行代码:

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MSG_INVALIDATE:
                ((View) msg.obj).invalidate();
                break;
                ...

代码中处理消息时view.invalidate方法是立即执行的(排除其它原因:排队、阻塞、CPU抢占等)。
也就是说postInvalidate()实际将invalidate任务加入队列中,理想民的 不考虑排队之类的情况,可以看成是立即执行的。

2.再来看postInvalidateOnAnimation的执行过程

public void postInvalidateOnAnimation() {
        // We try only with the AttachInfo because there's no point in invalidating
        // if we are not attache
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值