2012-06-25 19 views
0

我有一個簡單的圖形應用程序,它在屏幕上繪製一些東西。之前,當我在onDraw()中撥打invalidate()而沒有檢查時,我沒有任何問題。在我的應用程序onDraw()每秒鐘被調用很多次(我通過日誌瞭解到),但我不想每秒調用它多次,因爲我只想在每秒後更新屏幕。所以我試圖比較以前和現在的秒數 - 如果它們相同,我不會撥打invalidate();如果第二次更改,我會撥打invalidate()。這裏是我的代碼:秒不在onDraw更新()

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。爲什麼第二次不更新,即使我每次循環都要更新它。

+0

單獨問題:喬達時間http://joda-time.sourceforge.net/適合Android? – Joset

回答

1

Date對象的創建和設置爲當前時間,當你用它實例:

Date date = new Date(); 

每次調用date.getSeconds()時候,你剛開秒同一Date對象,其時間上不是招沒有改變。

這就是說,你的真正的問題是,你從onDraw()調用invalidate(),強制onDraw()另一個呼叫(這迫使另一...)。你不需要那樣做;已經在視圖無效時調用onDraw()。如果你是嘗試來動畫(1 fps?),你可以使用處理器postDelayed()或SurfaceView和另一個線程。

+0

是的,得到當前時間價值進入該對象,即時通訊使用相同的,所以即時獲得相同的價值。但我能做些什麼來獲得更新的價值? – Vins

+0

你可以再次調用'new Date()',但這真的不是解決你的大問題的正確方法。 –

+0

耶達達我也試過了,它的工作。但是如果我不檢查這個變化的時間,我不得不在每秒中抽出很多次。所以這比這更好嗎? – Vins

0

我通過每次創建新對象和現在的工作來更改代碼。

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