![](/img/trans.png)
[英]What is the difference between Dispatchers.Main and Dispatchers.Default in Kotlin coroutines?
[英]What's the difference between view.post() and GlobalScope.launch(Dispatchers.Main)?
实际上,我遇到了动态调整 textview 重力的问题,这取决于它的行数。
我读了这篇文章,但我只是不太了解线程技术的区别,就像textview.post()
, runOnUiThread{}
, GlobalScope.launch(Dispatchers.Main)
, Thead{}.start()
。
TLDR,简短的问题是“为什么下面的代码应该在 scope post
运行? ”
private fun setText(text : String) {
textView.text = text
textView.post {
if (textView.lineCount > 1) {
textView.gravity = Gravity.START
}else {
textView.gravity = Gravity.CENTER
}
}
}
另一个简短的问题是“为什么它在 GlobalScope.launch(Dispatchers.Main) 中不起作用? ”
这是我的尝试:
private fun setText(text : String) {
textView.text = text
GlobalScope.launch(Dispatchers.Main) {
if (textView.lineCount > 1) {
textView.gravity = Gravity.START
}else {
textView.gravity = Gravity.CENTER
}
}
}
我试图将它放入 GlobalScope.launch(Dispatchers.Main),但它有时有效,有时无效。 另外,我尝试在没有textView.post()
的情况下进行操作,但它不起作用。 getLineCount()
的源码好像不是异步操作?
欢迎任何建议,谢谢你的一切。
“发布”方法( View.post(...)
、 View.postDelayed(...)
等)将Runnable
放入由 UI/主线程处理的队列。 这里的重点是从单个线程完成所有 UI 更新。
GlobalScope.launch(Dispatchers.Main)
所做的是(除了前面提到的 post方法之外)它允许您使用Coroutines提供的所有功能:例如,您可以在不阻塞 Main/UI 线程的情况下suspend
代码执行。 这意味着您可以使用命令式编写代码,这对于更复杂的场景很方便,例如每隔几毫秒就循环更新 UI 。 只要您需要,您只需suspend
循环。 使用post方法,您必须每隔几毫秒使用 new Runnable
调用View.post(...)
来更新 UI。 有关更多详细信息,请阅读使用协程进行 UI 编程的整个指南。
我相信,您的实现“有时有效,有时无效”的原因可能是您需要从 UI(又名主)线程中调用所有 UI 操作方法; 这意味着您的textView.text = text
也应该是您的帖子块的一部分。
private fun setText(text : String) {
textView.post {
textView.text = text
if (textView.lineCount > 1) {
textView.gravity = Gravity.START
}else {
textView.gravity = Gravity.CENTER
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.