使用 Kotlin 在 Android Studio 中延迟后尝试执行行

Trying to execute line after delay in Android Studio with Kotlin

您好,我有一个 textView 元素,我正在尝试延迟更改其文本。 例如“你好”-> 等待 1 秒->“世界”-> 等待 1 秒->“你好吗?”

当我在一个单独的 kotlin 文件中的终端中使用我的代码时,它完全按照我想要的方式工作。 当我使用 MainActivity.kt 中的代码时,它会等待 1 秒并仅将文本值放入一次。 我认为它执行所有行 simultaneously.But 为什么终端和 ui 之间存在差异。

我的代码有一个 class 文件和 Main Activity

中的代码
class Ball (val Ball: TextView, val time: Long){

    fun textChange(){
        Handler().postDelayed({
            Ball.text = (1..90).random().toString()
        }, time)
    }
}

并在 MainActivity

class MainActivity : AppCompatActivity() {
    var resultsList = mutableListOf<Int>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    fun playButtonPressed(view:View){
        Ball(Ball01,1000).textChange()
        Ball(Ball01,1000).textChange()
        Ball(Ball01,1000).textChange()
        Ball(Ball01,1000).textChange()
        Ball(Ball01,1000).textChange()

    }
}

这样做,您要求显示 5 个字符串,但延迟相同。

在我看来,您必须使用 CountDownTimer 以固定间隔显示另一段文本。

这是一个示例代码

class Ball (val Ball: TextView, val messagesList: List<String>){

    private var index = 0
    fun textChange(interval: Long) {
        val time = interval * messagesList.size
        val timer = object: CountDownTimer(time, interval) {
            override fun onTick(millisUntilFinished: Long) {
                Ball.append(" " +messagesList[index++])
            }

            override fun onFinish() {
                //nothing to do
            }
        }
        timer.start()
    }
}

class MainActivity : AppCompatActivity() {
    var messageList = mutableListOf<String>("Hello", "World", "How are you ?")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    fun playButtonPressed(view:View){
        // will update the text every second during until the list is empty
        Ball(textView, messageList).textChange(1000)
    }
}

一个简单的方法是 post runnables 到 View 本身,因为它有自己的处理程序访问权限。

fun playButtonPressed(view:View){
    repeat(5) { repeat ->
        val number = (1..90).random().toString()
        val delay = (repeat + 1) * 1000L // repeat starts at 0
        Ball01.postDelayed({ Ball01.text = number }, delay)
    }
}

此外,您正在创建一个全新的一次性 Ball 对象,只是为了调用 textChange 函数,没有必要这样做。如果你想在 Ball class 中保留该行为,请将其粘贴在 companion object 中,然后你可以从 repeat 函数中调用 Ball.textChange(textView, delay)