我想要一个计数器(计数秒和分钟)并每秒在显示器上更新它。
我在我班级的onCreate
中有此代码,该代码扩展为Activity
:
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 :(得分:0)
这是因为您尝试从不同的线程内部更改textview。你不能这样做。您需要将消息发回给拥有textview的线程。
public void run()
这将启动一个与运行UI的新线程分开。
编辑:您正在寻找的代码在线有大量示例。只是谷歌的类似“Android线程消息处理程序。”
答案 1 :(得分: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);
}
答案 2 :(得分:0)
以下是您正在尝试执行的操作的完整步骤,并且在没有后台线程的情况下执行此操作。这比计时器更受欢迎,因为计时器使用单独的线程来执行更新。
http://developer.android.com/resources/articles/timed-ui-updates.html