2014-01-07 96 views
0

嗯,我只是想按一个按钮,倒计时出现在然而,当我按下按钮程序停止,最后显示数字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

我想你一直在寻找'Thread.sleep(1000)',但这不被推荐。因为你会睡主线。 – Doomsknight

+3

睡在android **上**工作。你只是没有正确使用它。 – njzk2

+2

基本上,它不能同时睡觉**和**,与其他人一样。 – njzk2

回答

3

首先,睡眠应该叫因为视频(X);

但另一方面,不建议睡眠,因为它会阻止用户与应用程序的交互。

如果你想倒计时(因为它看起来像你在做什么),你应该看看这个 http://developer.android.com/reference/android/os/CountDownTimer.html

+1

“睡眠应该被称为Thread.sleep(x)” - 在Android上,'SystemClock.sleep()'完全没问题,至少在Thread.sleep()'没有问题的地方。 IOW,虽然在问题中使用'sleep()'是不合适的,但这不是因为它在'SystemClock'而不是'Thread'上被调用。 – CommonsWare

+0

你是对的!我不知道SystemClock!虽然我没有说这个问题是睡眠本身:) – FOliveira

+1

据我所知SystemClock.sleep()不需要捕获中断的异常,这就是全部的区别 – marcinj

1

onClick在GUI线程中的单处理函数消息中执行,所以每次更改文本时都会覆盖之前的值,因此系统无法重绘视图。

而且你不应该调用sleep()在主界面线程,这将导致ANR - 应用notresponding

1

设置文本和绘图文本是独立的操作,无论发生在同一线程上。在框架有机会绘制任何东西之前,您将文本设置了三次,所以您看到的只是最后一次更改。

为了这个工作,你需要做你的文本更新,并睡在一个单独的线程。但是,您无法直接在其他线程上进行UI调用,因此您需要发布消息。

一种方法是创建一个AsyncTask,并使用上面的代码,但请致电publishProgress(),您当前拨打setText()。异步线程中的publishProgress()调用导致onProgressUpdate()在UI线程中运行;从那里,你可以拨打setText()更新UI。

编辑:CountDownTimer在不同的答案中提到的方法是更好的。