該函式所做的是將分子與分母分開,并在每秒后相應地更新應用程式的文本視圖,問題是它不會更新螢屏,它只是簡單地顯示分子的原始數字,即 60。我該怎么辦改變以使這項作業?
fun division() {
val numerator = 60
var denominator = 4
repeat(4) {
Thread.sleep(1_000)
findViewById<TextView>(R.id.division_textview).setText("${numerator / denominator}")
denominator--
}
}
uj5u.com熱心網友回復:
因為您在每次回圈時都在設定(基本上覆寫)文本,所以您只會看到最后一個增量的值,即 60/1,這就是為什么您只看到 60 值的原因。試試這樣:
fun division() {
val numerator = 60
var denominator = 4
repeat(4) {
Thread.sleep(1_000)
findViewById<TextView>(R.id.division_textview).append("${numerator / denominator}\n")
denominator--
}
}
setText()正在用新的文本覆寫文本,但append()會保留以前的文本。
uj5u.com熱心網友回復:
這又是那個該死的 Codelab 不是嗎?我知道它看起來很熟悉......我已經在這里回答了一個類似的問題- 但基本上,當你division在主執行緒上運行時(你必須這樣做,因為你正在搞亂 UI 組件),你正在凍結應用程式,因為你'重新阻塞執行緒Thread.sleep
直到您的代碼完成運行,即在您退出函式之后,顯示才能真正更新division,因為它都在同一個執行緒上運行,并且顯示更新傳遞稍后出現。所以這就是實際發生的事情:
- 凍結應用程式 1 秒
- 將文本設定為結果
60 / 4- 在您的代碼完成之后,它實際上不會重繪,因此沒有視覺變化 - 凍結應用程式 1 秒
- 將文本設定為
60 / 3- 的結果,你還不會看到任何事情發生,但現在它將顯示60 / 3而不是60 / 4,因為你剛剛更新了那個的狀態TextView - 等等
您設定的最后一個文本是 的結果60 / 1,然后您的代碼完成,因此系統終于可以開始更新顯示。因此,在應用停止凍結后您看到的第一件事是60- 它不僅僅是分子,它是您回圈中的最后一個計算。
如果您想在應用程式運行時更新某些內容,有很多解決方案,例如在特定時間執行的協程、 CountdownTimers、運行可運行檔案等。我鏈接的答案顯示了如何創建一個單獨的執行緒來運行基本相同的代碼post打開,因此您可以在不影回應用程式運行的情況下盡可能多地阻止它。您不做的一件事就是像 Codelab 示例那樣阻塞主執行緒。這是一個糟糕的 Codelab
uj5u.com熱心網友回復:
您可以使用delay然后從協程呼叫:
private suspend fun division() {
val numerator = 60
var denominator = 4
repeat(4) {
delay(1000)
findViewById<TextView>(R.id.division_textview).text = "${numerator / denominator}"
denominator--
}
}
然后從您的活動/片段中:
lifecycleScope.launch {
division()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481593.html
