2015-09-16 58 views
0

我的應用程序中有一個Canvas對象,我想每20ms更新一次。我嘗試了Java的TimerTask,但是它使得我的應用在幾次更新後崩潰。這是更新代碼;計時器任務使應用程序崩潰

timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      invalidate(); // canvas's update 
     } 
    }, 20, 20); 

我該怎麼辦?

編輯:錯誤日誌:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
+0

您應該向我們展示Logcat中的錯誤消息。 – CubeJockey

+0

發佈您的logcat錯誤。 –

回答

0

在這種情況下,run()被稱爲後臺線程,並invalidate()被稱爲對後臺線程。這將導致您的問題中出現異常,因爲這些更新只能在主應用程序線程上完成。

由於調用invalidate() 50次/秒不太可能成爲您正在嘗試解決的任何問題的正確解決方案,因此您可能希望提出一個單獨的堆棧溢出問題,您可以在其中解釋您嘗試對其進行什麼樣的更改你的用戶界面每20ms,看看推薦的方法是什麼。或者,拿起一本關於Android遊戲開發的書籍—,雖然你可能沒有構建遊戲,但是繪製到Canvas的遊戲開發者也有這樣的擔憂,所以他們使用的技術也可能與你相關。

+0

這是一個非常小的遊戲項目,我已完成從給定的代碼。它使用畫布,我無法改變它。 – MicrovaveProgrammer

+0

@MicrovaveProgrammer:這並不意味着每秒調用50次invalidate()是正確的解決方案,無論您嘗試解決什麼問題。 – CommonsWare

0

如果您真的想要想要來做到這一點,只需將invalidate更改爲postInvalidate

相關問題