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層次結構的原始線程可以調用它的方法。我很困惑,究竟我做錯了什麼。
azertiti是正確的,你必須調用'的sendMessage()''代替的handleMessage()'。如果你想在UI線程中發生某些事情,那麼必須從那裏調用該方法 - 如果你首先將消息發送到UI線程處理程序,則處理程序會爲你做這件事。如果你直接從你的後臺線程調用它,那麼它將在後臺線程中執行,並且從那裏執行的所有內容都會被執行,等等。 – zapl 2012-03-19 20:38:07
好的,我現在明白我的錯誤。如果我要使用runOnUiThread方法,我是否需要使用可運行的Ui方法調用它?我的擔心是,它會干擾Ui線程,因爲循環是連續的? – jmh 2012-03-19 21:19:11
如果使用runOnUiThread,則傳遞的runnable將在另一個線程上執行。不會干擾UI線程。 – azertiti 2012-03-19 21:27:10