我想在片段中按下按钮后运行线程,我确实是这样的:
btn!!.setOnClickListener {
activityCallback!!.runOnUiThread(Runnable {
Thread.sleep(10000)
Toast.makeText(
context,
"Done", Toast.LENGTH_LONG
).show()
})
}
但是在按下按钮后,所有元素都将锁定,直到时间到了,一切都不起作用
在不锁定的情况下按下按钮后如何运行线程?
谢谢
答案 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()
}
它如何工作?
Thread.sleep(10000)
内运行Thread {}.start()
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)
2)一旦延迟完成,我们将使用withContext(Dispatchers.Main){
切换回主线程并在其中显示吐司。