• Android 在View中更新View


    直接用Invalidate()方法会导致错误:只有主线程才能更新UI

    取而代之的是可以使用postInvalidate();

    原因:

    最终会调用ViewRootImpl类的dispatchInvalidateDelayed(View view, long delayMilliseconds) 方法;

    代码如下:

    public void dispatchInvalidateDelayed(View view, long delayMilliseconds) {
        Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view);
        mHandler.sendMessageDelayed(msg, delayMilliseconds);
    	//看到Handler就不用说为什么它能更新ui了吧
    }
    

    postInvalidate()方法:

    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 postInvalidateDelayed(long delayMilliseconds, int left, int top,
            int right, int bottom) {
    
        // 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) {
            final AttachInfo.InvalidateInfo info = AttachInfo.InvalidateInfo.obtain();
            info.target = this;
            info.left = left;
            info.top = top;
            info.right = right;
            info.bottom = bottom;
    
    		//这个最终调用ViewRootImpl类的dispatchInvalidateRectDelayed(info, delayMilliseconds)方法;
            attachInfo.mViewRootImpl.dispatchInvalidateRectDelayed(info, delayMilliseconds);
        }
    }
  • 相关阅读:
    高可用测试二
    sync包测试代码
    element 中 input设置了type="number"还能输入e和负数的问题如何解决?
    git添加rsa ssh key后仍提示Permission denied (publickey)解决方法
    nginx 反向代理跨域
    SAP ABAP MDG相关事务码 摘录
    其他23防抖
    Python内置函数:index
    Python内置函数:enumerate
    MySQL查看表占用空间大小
  • 原文地址:https://www.cnblogs.com/didikee/p/5622189.html
Copyright © 2020-2023  润新知