我需要从线程更新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()
,因此它只出现一次。然而,你将泄露一个不朽线程。