Android 为什么我的按钮在繁重的计算后被禁用,而它在计算前被调用?
我的应用程序中有一个按钮可以计算一些东西。当用户点击按钮时,该按钮应被禁用。当我使用下面的例子时,我的按钮在循环完成后被禁用。我希望在循环开始之前禁用该按钮。我怎样才能用下面的例子做到这一点Android 为什么我的按钮在繁重的计算后被禁用,而它在计算前被调用?,android,kotlin,Android,Kotlin,我的应用程序中有一个按钮可以计算一些东西。当用户点击按钮时,该按钮应被禁用。当我使用下面的例子时,我的按钮在循环完成后被禁用。我希望在循环开始之前禁用该按钮。我怎样才能用下面的例子做到这一点 fun calc() { myButton.isEnabled = false for (x in 0 until 1000000000) { println(x) } } 我相信发生的情况是,因为您在主线程中运行这个长时间运行的任务,UI无法直接更新。尝试在协同路
fun calc() {
myButton.isEnabled = false
for (x in 0 until 1000000000) {
println(x)
}
}
我相信发生的情况是,因为您在主线程中运行这个长时间运行的任务,UI无法直接更新。尝试在协同路由范围内运行循环,这样它就不会阻止UI的更新。 我使用了以下代码,按钮被直接禁用:
fun calc(){
clickableButton.isEnabled=false
生命周期望远镜发射{
withContext(Dispatchers.Default){
对于(0中的x,直到100000){
Log.d(“计算:”,“$x”)
}
}
}
}
一旦进入循环,直到完成循环,UI才会更新。我不知道Kotlin语法,但基本上需要在另一个线程上运行这个循环。在Java中,您可以使用new Handler().postdayed(new Runnable(…)@DanBaruch Handler将Runnable发回UI线程,因此同样的问题也会发生,请实例化一个新线程。在kotlin中,只需使用activity.lifecycleScope.launch(Dispatchers.Default){…}
@AnimeshSahu,它将仅在调用runOnUiThread时发布到UI,我错了吗?@DanBaruch处理程序与它根据的线程相关联。这是更好的解释:我发现这很奇怪,因为我一直在使用thread.sleep处理程序,而且我的UI仍然是活动的。我会检查它并更新回来。你看到我在那里用新的Runnable了吗?编辑:我刚刚检查过,你确实是对的。很高兴知道。谢谢@AnimeshSahu