在onDraw()中没有更新的秒数

时间:2012-06-25 05:00:23

标签: java android android-date

我有一个简单的图形应用程序,可以在屏幕上绘制一些内容。以前,我在没有支票的情况下在invalidate()中拨打onDraw()时没问题。在我的应用程序中onDraw()每秒被调用多次(我通过日志来了解),但我不想每秒多次调用它,因为我想在每秒后更新屏幕。所以我试着比较前一秒和当前秒 - 如果它们相同,我就不会叫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没有变化。为什么第二次没有更新,即使我每次循环都要更新它。

2 个答案:

答案 0 :(得分:1)

您的Date对象已创建并设置为当您使用以下对象进行实例化时的当前时间:

Date date = new Date();

每次拨打date.getSeconds()时,您只是在同一个Date对象上获取秒数,其时间没有变化。

那就是说,你真正的问题是你从invalidate()打来onDraw(),迫使另一个电话onDraw()(迫使另一个......)。你不需要这样做;只要View变为无效,就会调用onDraw()。如果你尝试动画(1 fps?),你可以使用带有postDelayed()的处理程序或SurfaceView和另一个线程。

答案 1 :(得分:0)

我通过每次创建新对象并立即工作来更改代码。

        do{ 
        Log.d("Filling","curSec="+curSec+"  lastSec="+lastSec);
        curSec = new Date().getSeconds();
        }while(curSec == lastSec);