单击时使用Thread.sleep时无法使用setBackgroundResource()

时间:2019-12-23 15:30:02

标签: android kotlin

我可以使用以下方法成功更改颜色:

TextView1.setOnClickListener{
 TextView1.setBackgroundResource(R.color.red);
}

但是如果我使用

     TextView1.setOnClickListener{
         TextView1.setBackgroundResource(R.color.red);
         Thread.sleep(1_000)
         TextView1.setBackgroundResource(R.color.white);
        }

颜色完全不变。为什么会这样?

3 个答案:

答案 0 :(得分:1)

虽然UI线程正在final String driver = "com.mysql.jdbc.Driver"; final String url = "jdbc:mysql://external_ip_address_here:3306/dbname"; final String username = "user"; final String password = "pass"; Class.forName(driver); Connection connection = DriverManager.getConnection(url, username, password); 中,但是它无法将更改呈现到屏幕上。 sleep()将不会执行。为了应用更改(例如背景色),您必须通过从您所在的事件处理程序中返回来完全将控制权返回到框架的消息循环(onDraw())。

尝试以下方法:

Handler

答案 1 :(得分:1)

这是由于以下事实:调用Thread.sleep()只会导致线程挂起,在此特定示例中,这会导致GUI(图形用户界面)线程挂起。

屏幕上gui元素的实际绘制发生在同一线程上,在他调用完方法之后,您没有时间给他这样做。

您可以通过调度延迟的呼叫来达到相同的结果。

TextView1.setOnClickListener {
    TextView1.setBackgroundResource(R.color.red);

    Handler().postDelayed({
        this@MainActivity.runOnUiThread(java.lang.Runnable {
            TextView1.setBackgroundResource(R.color.white);
        })
    }, 1000)
}

答案 2 :(得分:0)

因为调用Thread.sleep()时,它将阻塞UI,并且在sleep()运行后,UI不会更改为setBackgroundResource(R.color.red),因此您调用setBackgroundResource(R.color.white),因此它只会更新白色,而您没有看到红色改变