嗯,我只想按一个按钮并在其中显示倒计时,但是当我按下按钮时程序停止并最终显示数字1但不显示3或2。
btnTurno.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
btnTurno.setText("3");
SystemClock.sleep(1000);
btnTurno.setText("2");
SystemClock.sleep(1000);
btnTurno.setText("1");
}
});
我做错了什么?
答案 0 :(得分:3)
首先,Sleep应该被称为Thread.sleep(x);
但另一方面,不推荐睡眠,因为它会阻止用户与应用程序的交互。
如果你想倒计时(因为它看起来像你在做什么),你应该看看这个 http://developer.android.com/reference/android/os/CountDownTimer.html
答案 1 :(得分:1)
onClick正在GUI线程上的单个处理程序消息中执行,因此每次更改文本时,它都会覆盖以前的值,因此系统无法重绘视图。
另外你不应该在主gui线程上调用sleep(),这会导致ANR - 应用程序没有响应
答案 2 :(得分:1)
设置文本和绘制文本是在同一个线程上发生的单独操作。你在框架有机会绘制任何东西之前设置了三次文本,所以你看到的只是最后一次改变。
为此,您需要进行文本更新并在单独的线程上休眠。但是,您无法直接在其他线程上进行UI调用,因此您需要发布消息。
一种方法是创建AsyncTask,并使用上面的代码,但请拨打当前正在调用publishProgress()
的{{1}}。异步线程中的setText()
调用导致在{i}}线程中运行publishProgress()
;从那里,您可以致电onProgressUpdate()
来更新用户界面。
修改:不同答案中提到的setText()
方法更好。