秒数未在onDraw()中更新

2020年10月27日 25点热度 0条评论

我有一个简单的图形应用程序,可以在屏幕上绘制一些东西。以前,在没有检查的情况下在invalidate()中调用onDraw()时我没有问题。在我的应用程序中,每秒onDraw()每秒被调用多次(我通过Logs知道了),但是我不想每秒调用多次,因为我只想每秒更新一次屏幕。因此,我尝试比较以前的秒和当前的秒-如果它们相同,则不会调用invalidate();如果第二次更改,我将呼叫invalidate()。这是我的代码:

protected void onDraw(Canvas canvas) {         
    // Create date to check current second
    Date date = new Date();
    canvas.drawColor(Color.WHITE);

    drawArcs(canvas, mBigOval, mUseCenters[0], mPaints[0]); 

    //Get the current second 
    curSec = date.getSeconds();
    //compare if its same as lastSec which is updated in drawArcs() which i called before

    do {    
        Log.d("Graphics","curSec="+curSec+"  lastSec="+lastSec);
        curSec = date.getSeconds();
    } while(curSec == lastSec);

    Log.d("Graphics","Calling invalidate() and  count="+(++count));
    invalidate();
}  

使用上面的代码,如果我的应用程序在30秒启动,则日志显示:

     06-25 10:25:52.257: D/Graphics(14711): curSec=30  lastSec=30

上面的日志不断重复,而curSec和lastSec没有变化。为什么即使每次循环都进行更新,第二个也不更新?

解决方案如下:

您的Date对象已创建,并使用以下示例将其设置为当前时间:

Date date = new Date();

每次调用
date.getSeconds()时,您只会获得同一
Date对象的秒数,该对象的时间没有改变。

就是说,您真正的问题是您正在从
invalidate()调用
onDraw(),从而强制再次调用
onDraw()(这将强制另一个...)。您不需要这样做;每当视图变为无效时,都会调用
onDraw()。如果要进行动画处理(以1 fps?),则可以将Handler与
postDelayed()或SurfaceView和另一个线程一起使用。