Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我的按钮在繁重的计算后被禁用,而它在计算前被调用?_Android_Kotlin - Fatal编程技术网

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