簡體   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