我使用com.apache.commons库设置了秒表,秒表似乎工作正常。我不知道怎么做是在我的应用程序的textView中显示这个秒表。一般来说,我不知道它会如何工作,即如果秒表上的时间不断变化,那么秒表在textView中的显示效果如何呢?目前,我有下面的代码,它每秒更新textView中的文本大约2秒,然后我得到一个奇怪的错误。我甚至不确定这是否是正确的方法。请帮忙!
Timer timer = new Timer();
TimerTask timerTask;
timerTask = new TimerTask() {
@Override
public void run() {
timeText.setText(time.toString());
}
};
timer.schedule(timerTask, 0, 1000);
我在2秒后得到的错误(并且它成功更新了时间)是:
“只有创建视图层次结构的原始线程才能触及其视图”
答案 0 :(得分:3)
您只能在UI线程上更新TextView
。
runOnUiThread(new Runnable() {
@Override
public void run() {
//stuff that updates ui
}
});
您的代码变为
Timer timer = new Timer();
TimerTask timerTask;
timerTask = new TimerTask()
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
timeText.setText(time.toString());
}
});
}
};
timer.schedule(timerTask, 0, 1000);
如果您在那里收到错误,则可能需要myActivityObject.runOnUiThread()
。
有关详细信息,请参阅this。
答案 1 :(得分:0)
要从另一个线程更新视图,您应该使用handler。
private void startTimerThread() {
Handler handler = new Handler();
Runnable runnable = new Runnable() {
private long startTime = System.currentTimeMillis();
public void run() {
//Change the condition for while loop depending on your program logic
while (true) {
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable(){
public void run() {
timeText.setText(time.toString());
}
});
}
}
};
new Thread(runnable).start();
}