繁体   English   中英

view.post() 和 GlobalScope.launch(Dispatchers.Main) 有什么区别?

[英]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()的源码好像不是异步操作?

欢迎任何建议,谢谢你的一切。

1. view.post() 和 GlobalScope.launch(Dispatchers.Main) 的区别?

“发布”方法( 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 编程的整个指南

2.“……有时有效,有时无效……”

我相信,您的实现“有时有效,有时无效”的原因可能是您需要从 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM