2010-12-04 42 views
0

我想要一個計數器(計數秒和分鐘)並在顯示屏上每秒更新一次。Android:修改一個定時器中的XML元素

我有我的類,它擴展ActivityonCreate此代碼:

timeOnCall = (TextView) findViewById(R.id.time); 
minutes = seconds = 0; 
timeOnCall.setText(minutes + ":" + seconds); 

// Implements the timer 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    public void run() { 
     ++seconds; 
     if (seconds == 60) { 
      seconds = 0; 
      ++minutes; 
     } 
     // Display the new time 
     timeOnCall.setText(minutes + ":" + seconds); 
    } 
}, 1000, 1000); 

不幸的是,我得到以下錯誤:

android.view.ViewRoot$CalledFromWrongThreadException:只有創建視圖層次原來thread可以觸摸其觀點。

我不知道如何解決這個問題,因爲它已經在onCreate()方法中。有誰知道解決方案?

回答

0

你可以用一個處理程序去做,事情精簡版這樣的:

final Handler mHandler = new Handler(); 
final Runnable updateText = new Runnable() { 
    public void run() { 
     timeOnCall.setText(minutes + ":" + seconds); 
    } 
}; 

中的onCreate,你可以運行:

onCreate(Bundle b) { 
... 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      ++seconds; 
      if (seconds == 60) { 
       seconds = 0; 
       ++minutes; 
      } 

      // Display the new time 
     mHandler.post(updateText); 
     } 
    }, 1000, 1000); 
} 
0

它是因爲你試圖從不同的線程內改變textview。你不能那樣做。您需要將消息發回到擁有textview的線程。

public void run() 

這會啓動一個與正在運行您的用戶界面的新線程不同的新線程。

編輯:有很多示例在線用於您正在尋找的代碼。只是谷歌像「Android線程消息處理程序」。

+0

謝謝。我不知道該怎麼做,請給我一個教程或例子嗎?這會有很大的幫助。謝謝! – James 2010-12-04 01:21:37

+0

那麼它是「新的TimerTask」應該是一個新的線程,它可以執行.setText()嗎? – James 2010-12-04 01:23:40

+0

我確實將整個代碼放入了我創建的新線程的運行方法中。那仍然崩潰。 – James 2010-12-04 01:29:21