2012-03-19 51 views
1

我一直在試圖弄清楚如何製作精確到百分之一秒的自定義精密時計。我看了很多其他類似的問題,並決定使用線程和處理程序來嘗試它。創建在UI線程中更新的秒錶Android

這是我的自定義的handleMessage方法:

public void handleMessage(Message msg) { 
    String timeText = msg.getData().getString("time"); 
    watch.setText(timeText); 
} 

手錶的對象僅僅是在初始化的onCreate一個TextView()。

這是我的運行方法的主要塊:

while(true) { 
    long timeElapsed = System.currentTimeMillis() - startTime; 
    int hundreths = (int)((timeElapsed % 1000)/10); 
    int seconds = (int)((timeElapsed % 60000)/1000); 
    int minutes = (int)(timeElapsed/60000); 
    Bundle bundle = new Bundle(); 
    bundle.putString("time", String.format("d:%02d.%02d", minutes, seconds, hundreths)); 
    Message msg = handler.obtainMessage(); 
    msg.setData(bundle); 
    handler.handleMessage(msg); 
} 

我意識到後面使用一個處理程序的整體思路是,只有UI線程可以更新屏幕上的元素,但我仍然得到一個CalledFromWrongThreadException與消息,只有開始創建View層次結構的原始線程可以調用它的方法。我很困惑,究竟我做錯了什麼。

+0

azertiti是正確的,你必須調用'的sendMessage()''代替的handleMessage()'。如果你想在UI線程中發生某些事情,那麼必須從那裏調用該方法 - 如果你首先將消息發送到UI線程處理程序,則處理程序會爲你做這件事。如果你直接從你的後臺線程調用它,那麼它將在後臺線程中執行,並且從那裏執行的所有內容都會被執行,等等。 – zapl 2012-03-19 20:38:07

+0

好的,我現在明白我的錯誤。如果我要使用runOnUiThread方法,我是否需要使用可運行的Ui方法調用它?我的擔心是,它會干擾Ui線程,因爲循環是連續的? – jmh 2012-03-19 21:19:11

+0

如果使用runOnUiThread,則傳遞的runnable將在另一個線程上執行。不會干擾UI線程。 – azertiti 2012-03-19 21:27:10

回答