【问题标题】:Android: sleep doesn't work with UI changesAndroid:睡眠不适用于 UI 更改
【发布时间】:2014-09-18 21:58:16
【问题描述】:

我正在制作简单的测验应用程序,现在等待出现问题。 当用户点击四个可能的答案之一时,它应该变为橙色,两秒钟后变为红色或绿色(正确或错误答案)。这是我的代码的一部分:

public void clickButton(View v) {
    changeButton(v, getResources().getDrawable(R.drawable.btn_orange));
    try {
        //Thread.sleep(2000);
        TimeUnit.SECONDS.sleep(2);
    } catch ( InterruptedException r ) {}

    changeButton(v, getResources().getDrawable(R.drawable.btn_red));
}   

我尝试过线程睡眠或时间单元睡眠,但在这两种情况下,按钮都会变为默认的白色“点击”阶段,并在两秒后变为红色 - 完全跳过橙色部分。我检查了其他颜色,所以在那些颜色 xml 文件中这绝对不是问题。问题可能出在那个睡眠的某个地方,但我不知道我应该用什么来延迟红色并且仍然是橙色。 谢谢建议

【问题讨论】:

  • 你不应该睡在主线程上,看看 View.postDelayed()
  • 实际上你不能在 UI 线程上休眠。

标签: android sleep


【解决方案1】:

@panini 是对的,你不应该在主线程上睡觉,而是使用另一个线程,尝试这样的事情,没有经过测试,所以我不知道它是否会工作,但这是一个想法:

public void clickButton(final View v) {
    changeButton(v, getResources().getDrawable(R.drawable.btn_orange));
    v.postDelayed(new Runnable() {
        @Override
        public void run() {
            changeButton(v, getResources().getDrawable(R.drawable.btn_red));
        }
    }, 2000);


}

也许你需要强制线程在 UI 中运行,还是试试吧。如果这不起作用,您始终可以使用 AsyncClass。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    将延迟的Runnables 发布到 UI 线程的一种简单方法是将消息传递给 UI 线程的 Handler

    例如:

     new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
          @Override
          public void run() {
            changeButton(v, getResources().getDrawable(R.drawable.btn_orange));
          }}, 2000);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2014-07-25
      • 2020-05-29
      相关资源
      最近更新 更多