Java sleep 命令忽略 sleep 之前的命令

标签 java android

我的 Activity 上有一个按钮,当我单击它时,我希望按钮改变颜色,等待一段时间,然后再次改变颜色。

我尝试过以下两个版本的 sleep :

尝试1:

public void buClick(View view) {
    Button buCard = (Button) view;
    buCard.setBackgroundColor(Color.GREEN);

    TimeUnit time = TimeUnit.SECONDS;
    try {
        time.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    buCard.setBackgroundColor(Color.RED);
}

尝试2:

public void buClick(View view) {
    Button buCard = (Button) view;
    buCard.setBackgroundColor(Color.GREEN);

    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    buCard.setBackgroundColor(Color.RED);
}

两种方法的结果是相同的:

  • 按钮被点击
  • 按钮的背景保持默认
  • 应用程序等待 2 秒
  • 按钮的背景变为红色

按钮在任何时候都不会变成绿色;我做错了什么?

谢谢

最佳答案

不要阻塞您的 UI 线程。请改用处理程序。

如果您尝试阻止主线程,整个 UI 线程将停止,导致您的应用程序卡住,一旦您的 sleep 结束,您将调用 setBackgroundColor(Color.RED)。并且应用了红色,这就是为什么您看不到绿色的变化。

如果您使用像下面这样的处理程序,它不会阻塞 UI 线程,您应该能够看到颜色变化。

在此处了解为什么不应阻止 UI 线程 https://developer.android.com/guide/components/processes-and-threads.html

    Button buCard = (Button) view;

    buCard.setBackgroundColor(Color.GREEN);

    Handler handler = new Handler();
    Runnable r=new Runnable() {
        public void run() {
           buCard.setBackgroundColor(Color.RED);           
        }
    };
    handler.postDelayed(r, 2000);

关于Java sleep 命令忽略 sleep 之前的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56876836/

相关文章:

android - std::map 链接器错误 ndk r8c with APP_STL := gnuSTL_static

java - 如何在Android 4中使用NavigationView

java - TreeSet 不行,下面的代码有什么问题吗?

java - 如果缺少 javax.xml.XPath,如何导入?

java - 如何在 Hadoop Mapper 中处理 XML 文件

android - 处理 CursorLoader 异常

java - 同时运行多个线程

java - 如何在android中选择多个文件

android - 即使应用程序被用户从后台杀死,如何始终运行后台服务

xml - 如何使用 XML 根据图像大小调整 Android 组件的大小