创建一个在UI线程Android中更新的秒表

时间:2012-03-19 19:58:22

标签: android multithreading textview handler

我一直在努力弄清楚如何制作精确到百分之一秒的自定义精密计时器。我查看了很多其他类似的问题,并决定使用线程和处理程序进行尝试。

这是我的自定义handleMessage方法:

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

watch对象只是在onCreate()中初始化的TextView。

这是我的run方法的主要部分:

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层次结构的消息才能调用方法在上面。我很困惑我究竟做错了什么。

1 个答案:

答案 0 :(得分:2)

我认为您的错误是因为您使用的是handleMessage而不是sendMessage。

更简单的方法可能是使用runOnUiThread方法并放弃处理程序。

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable