Multi-thread runOnUiThread



我需要从线程更新UI。在这样做的过程中,我创建了一个Toast消息来测试该函数是否按预期工作。而在我的线程中,我运行函数" runonuread"并在此函数中放置Toast消息,如下所示…

runOnUiThread {
Toast.makeText(this, "DIALOG Start", Toast.LENGTH_SHORT).show()
}

虽然这可以工作,但它也不起作用。Toast消息停留在设备屏幕上。我已经在模拟器和现场设备上进行了测试。每次我运行代码时,Toast消息都会留在屏幕上。

但是,如果我将toast消息分离为扩展类型函数,它将按预期工作。

val toast = Toast.makeText(this@MainActivity, "Dialog finish", Toast.LENGTH_SHORT)
runOnUiThread {
toast.show()
}

运行正常

我想知道,为什么?这两组代码都调用runOnUiThread()。两者都在调用Toast消息。这两者有什么不同?

这是使用Kotlin和更新UI和从线程更新的产品吗?这是因为线程没有停止吗?如果我呼叫

, Toast会消失吗?
thread.stop() Although it is deprecated.

下面是有效的代码:

progressDoalog!!.max = 100
val toast = Toast.makeText(this@MainActivity, "Dialog finish", Toast.LENGTH_SHORT)
Thread {
try {
while (progressDoalog!!.progress <= progressDoalog!!.max) {
Thread.sleep(50)
handle.sendMessage(handle.obtainMessage())
if (progressDoalog!!.progress == progressDoalog!!.max) {
progressDoalog!!.dismiss()
runOnUiThread {
toast.show()
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}.start()

如果修复缩进,问题的原因就更清楚了:

val toast = Toast.makeText(this@MainActivity, "Dialog finish", Toast.LENGTH_SHORT)
Thread {
try {
while (progressDoalog!!.progress <= progressDoalog!!.max) {
Thread.sleep(50)
handle.sendMessage(handle.obtainMessage())
if (progressDoalog!!.progress == progressDoalog!!.max) {
progressDoalog!!.dismiss()
runOnUiThread {
toast.show()
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}.start()

这个while循环永远运行。一旦progress等于max,你就开始一遍又一遍地播放祝酒词。while循环的条件将永远为真,因此它永远不会停止在Toast上调用show()

在你的非工作代码中,你在循环的每次迭代中都创建了一个新的Toast,所以一旦一个Toast消失,在它后面就会有另一个相同的Toast。

在你的"工作"中代码中,您在同一个Toast实例上反复调用show(),因此它只出现一次。然而,你将泄露一个不朽线程。

最新更新