Android和Kotlin中的按钮后线程

时间:2019-02-28 02:00:19

标签: android kotlin

我想在片段中按下按钮后运行线程,我确实是这样的:

btn!!.setOnClickListener {
        activityCallback!!.runOnUiThread(Runnable {

            Thread.sleep(10000)

            Toast.makeText(
                context,
                "Done", Toast.LENGTH_LONG
            ).show()
        })
}

但是在按下按钮后,所有元素都将锁定,直到时间到了,一切都不起作用

在不锁定的情况下按下按钮后如何运行线程?

谢谢

3 个答案:

答案 0 :(得分:1)

问题

Thread.sleep(10000)(和runOnUiThread)内执行Handler().post将锁定ui线程。

解决方案

您需要使用Thread类来代替runOnUiThread。

button9.setOnClickListener {
            Thread {
                Thread.sleep(10000)
                runOnUiThread(Runnable { Toast.makeText(this@DebugActivity, "Done", Toast.LENGTH_LONG).show() })
            }.start()
        }

它如何工作?

  1. Thread.sleep(10000)内运行Thread {}.start()
  2. Toast.makeText(...).show()中运行runOnUiThread,因为显示吐司需要UI线程。

答案 1 :(得分:1)

简单的方法是延迟使用Handler。请在下面找到代码

btn!!.setOnClickListener{
    Handler().postDelayed({
        Toast.makeText(context,"Done", Toast.LENGTH_LONG).show()
    },10000L) // delays the execution for 10s

} 

答案 2 :(得分:0)

您可以仅使用协程实现这一目标。由于线程通常很昂贵,因此协程更轻便。对于这个问题,我们必须做两件事

1)您必须无阻塞地延迟线程

2)吐司必须显示在UI线程上

btn!!.setOnClickListener {
      GlobalScope.launch {
         delay(10000L)
         withContext(Dispatchers.Main){
             Toast.makeText(context,"Done", Toast.LENGTH_LONG).show()
         }
   }
}

所以在上面的代码中

1)GlobalScope.launch-使用delay(10000L)

启动调度程序工作线程并将执行延迟10000毫秒

2)一旦延迟完成,我们将使用withContext(Dispatchers.Main){切换回主线程并在其中显示吐司。