你不在子线程中操作,并将postInvalidate()改为invalidate(),运行看能不能刷新呢

解决方案 »

  1.   

    不行,试过,我解决了,我用handler延时1秒后再在handleMessage里面去执行test方法就可以了,就我现在看到的情况来看,view = (TestOnDraw) findViewById(R.id.test);这句话并不会马上调用onDraw,test方法中加日志可以看到是先进了test方法后才调用onDraw,而且这时test中的postInvalidate方法也没起作用(将test方法清空,可以看到也进了一次onDraw方法,证实跟postInvalidate无关),所以我总结应该是onDraw方法不会在初始化自定义控件后马上调用
      

  2.   

    onDraw()的方法是当在屏幕中需要显示界面的时候才调用的,android会判断某个界面是否需要绘制,如果不需要就根本不会调用到他的onDraw 方法, 例如你把你的自定义view设置为GONE,那么你根本看不到打出来的log了
    另外,为什幺要调用postInviliade呢, Java 的动态绑定机制不是会默认调用子类的onDraw方法吗? 你在线程中再调取一次postInvliade有什么意义吗?
      

  3.   

    不行,试过,我解决了,我用handler延时1秒后再在handleMessage里面去执行test方法就可以了,就我现在看到的情况来看,view = (TestOnDraw) findViewById(R.id.test);这句话并不会马上调用onDraw,test方法中加日志可以看到是先进了test方法后才调用onDraw,而且这时test中的postInvalidate方法也没起作用(将test方法清空,可以看到也进了一次onDraw方法,证实跟postInvalidate无关),所以我总结应该是onDraw方法不会在初始化自定义控件后马上调用你说的将将test方法清空是什么意思呢?
      

  4.   

    我觉得在view = (TestOnDraw) findViewById(R.id.test)时onDraw并不是延迟执行了,而是根本就没有执行。
      

  5.   

    执行了,我说清空test方法就是将test方法弄成空实现,里面一行代码都没有,完后可以看到onDraw还是调用了的
      

  6.   


    我是程序要不断的去改变这个自定义View的显示形状,所以要不断的重绘,我这里为了让问题清楚没有将其他逻辑包含进来
      

  7.   


    我是程序要不断的去改变这个自定义View的显示形状,所以要不断的重绘,我这里为了让问题清楚没有将其他逻辑包含进来..那就在 onDraw() 里调用invaliade,另外建议使用Surface View 实现,避免阻塞线程
      

  8.   

    执行了,我说清空test方法就是将test方法弄成空实现,里面一行代码都没有,完后可以看到onDraw还是调用了的postInvalidate() 是往UI队列中丢一个线程,之后开始渲染流程。在onCreate中 所有的界面并没有实际生成,所以会优先执行postInvalidate中的代码(这个在渲染队列前头)。
    但是这个是没有效果的。 view 中有个skipInvalidate()方法 说的就是 当view未显示时候,是被skip掉的。假如你delay了这个1-2秒,  这个代码执行时后界面已经生成了,他的invalidate就生效, 就会出现你想要的执行两次。另 界面生成时候,必然会调用一次onDraw。
        /**
         * Invalidate the whole view. If the view is visible,
         * {@link #onDraw(android.graphics.Canvas)} will be called at some point in
         * the future. This must be called from a UI thread. To call from a non-UI thread,
         * call {@link #postInvalidate()}.
         */
        public void invalidate() {
            invalidate(true);
        }    public void invalidate(Rect dirty) {
            if (skipInvalidate()) {
                return;
            }
         }
    }