2013-07-30 71 views
0

我剛剛開始編程android應用程序,現在我有一個定時器和計時器任務的問題。定時器/ TimerTask錯誤

在我的應用程序中,我使用計時器來更新用戶界面,但是當我開始測試時出現錯誤,我必須強制關閉它。

這裏是我的計時器代碼:

int delay = 5000; // delay for 5 sec. 
int period = 1000; // repeat every sec. 

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() 
{ 
    public void run() 
    { 
     moveLettersInCircle(); 

    } 

}, delay, period); 

logcat中這樣說:

07-30 18:40:12.635: D/dalvikvm(334): GC_EXTERNAL_ALLOC freed 61K, 52% free 2599K/5379K, external 1625K/2137K, paused 52ms 
07-30 18:40:16.186: D/dalvikvm(334): GC_EXTERNAL_ALLOC freed 36K, 51% free 2672K/5379K, external 3792K/4025K, paused 40ms 
07-30 18:40:21.503: W/dalvikvm(334): threadid=9: thread exiting with uncaught exception (group=0x40015560) 
07-30 18:40:21.526: E/AndroidRuntime(334): FATAL EXCEPTION: Timer-0 
07-30 18:40:21.526: E/AndroidRuntime(334): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.ViewRoot.checkThread(ViewRoot.java:2932) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.View.requestLayout(View.java:8267) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.View.requestLayout(View.java:8267) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.View.requestLayout(View.java:8267) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.View.requestLayout(View.java:8267) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.View.requestLayout(View.java:8267) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.View.requestLayout(View.java:8267) 
07-30 18:40:21.526: E/AndroidRuntime(334): at android.view.View.setLayoutParams(View.java:5000) 
07-30 18:40:21.526: E/AndroidRuntime(334): at com.jest.womix.Game$1.run(Game.java:104) 
07-30 18:40:21.526: E/AndroidRuntime(334): at java.util.Timer$TimerImpl.run(Timer.java:284) 
07-30 18:40:25.666: I/Process(334): Sending signal. PID: 334 SIG: 9 

我該如何解決這個問題?

編輯處理代碼:

Handler m_handler; 
    Runnable m_handlerTask; 
    m_handler = new Handler(); 
    m_handlerTask = new Runnable() 
    { 
     @Override 
     public void run() { 

     moveLettersInCircle(); 
     m_handler.postDelayed(m_handlerTask, 1000); //Problem: The local variable m_handlerTask may not have been initialized --> But if I initialize it then I get another error in the line m_handlerTask = new Runnable() 

     } 
     }; 
    m_handlerTask.run(); 

問候

+0

發佈moveLettersInCircle的'()的代碼;' – Raghunandan

+0

編輯我原來的職位 – Salexes

+0

後您完整的類代碼。你需要將它們聲明爲類變量'Handler m_handler; Runnable m_handlerTask;'。 – Raghunandan

回答

4

我猜你是從backgroudn線程更新UI。計時器在另一個線程上運行。

你應該在ui線程上更新ui。使用runOnUiThread

runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         // update ui here. 
        } 
       }); 

android.view.ViewRoot $ CalledFromWrongThreadException:只有創建視圖層次可以觸摸的意見 原來的線程。

以上通常意味着你正在更新/從另一個線程訪問ui。

你也可以使用一個Handler

Handler m_handler; 
Runnable m_handlerTask ; 
m_handler = new Handler(); 
m_handlerTask = new Runnable() 
{ 
    @Override 
    public void run() { 

    // do something 
    m_handler.postDelayed(m_handlerTask, 1000);  

    } 
    }; 
m_handlerTask.run(); 

要取消運行m_handler.removeCallbacks(m_handlerTask)

編輯:

 timer.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 

       runOnUiThread(new Runnable() //run on ui thread 
       { 
        public void run() 
        { 
        // update ui here 
        } 
        }); 
      } 
     }, 1000, 1000); 
+0

噢好吧,謝謝你解釋它:) 因此,我必須添加您上面張貼的代碼? – Salexes

+0

在您的計時器任務中使用'runOnUiThread'並調用方法或使用處理程序 – Raghunandan

+0

好吧。我會試試看 - 我怎樣才能取消定時器? – Salexes