Kotlin - UI 更新之间的延迟

问题描述

我创建了一个简单的 tik-tac-toe 游戏,并且有一些您可以玩的机器人。我试图在连续的机器人轮次之间有一个延迟,否则所有连续的机器人移动都会同时出现在屏幕上

这是我在代码中尝试过的:

    // bot functionality
private fun botturn(botDifficulty: Int) {
    var botMove = 100
    when (botDifficulty) {
        1 -> botMove = easyBot(confirmedMoves)
        2 -> botMove = mediumBot(activePlayer,confirmedMoves,maxPlayers)
        3 -> botMove = hardBot(activePlayer,maxPlayers)
        else -> Toast.makeText(this,"What sort of bot is this??",Toast.LENGTH_SHORT).show()
    }
    
    trueCellID = botMove
    // colour chosen segment
    setSegmentColor(trueCellID,-1,activePlayer)
    // Todo add 1-2 second delay after confirming move?
    Log.d("Wait","start of wait $activePlayer")
    Thread.sleep(1000)
    Log.d("Wait","end of wait $activePlayer")
    
    confirmMove()
}

使用 Thread.sleep 似乎只是延迟所有 UI 更新,直到所有 botPlayer 睡眠发生后。我也尝试过使用 Handler.postDelayedGlobalScope.launchdelay 块和 runOnUiThreadSystemClock.sleep(1000) - 这些都存在相同的问题,即执行所有机器人等待,然后是 UI 更新。

我什至尝试尝试调整此解决方案 - how to wait for Android runOnUiThread to be finished? 但得到了相同的结果 - 然后所有 UI 更新都有很大的延迟。

是否有解决方法或我错过了一些简单的东西?

解决方法

正如 broot 在评论中所建议的,将 setSegmentColor()confirmMove() 都放在 postDelayed() 块中实现了 botTurn() 之间的期望延迟

val botDelay = 1500L

        Handler().postDelayed(
            {
                // colour chosen segment then save move
                setSegmentColor(botMove,-1,activePlayer)
                confirmMove(botMove)
            },botDelay
        )