![](/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.