Kotlin Handler class:如何在满足条件时从 运行() 内部停止线程?

Kotlin Handler class: How to stop a thread - from inside of run() - when a condition is met?

我目前正在学习如何开发 android 应用程序。对于我的第一个应用程序,我想构建一个带有原始战斗系统的简单答题器。

在我的代码中,我创建了一个 Handler 实例 和一个 Runnable 对象。在这个 "delayed loop" 中,敌人每 3 秒攻击一次玩家实例,造成伤害。在循环中,我还测试了玩家的 hp 何时 小于或等于 0;当满足条件时,我想停止可运行对象

我该怎么做?我尝试调用包含 Handler.removeCallbacks 的函数 stopCombat(),但我无法在声明前调用函数。我试着把 .removeCallbacks(this) 放在 run() 里面,但它也不起作用。

val mainHandler = Handler(Looper.getMainLooper())

    fun playerDied() {
        ongoingFight = false
        combatLog.append("${myPlayer.name} has been defeated!\n")
        myPlayer.currentHitPoints = myPlayer.maxHitPoints / 2
        myPlayer.gold = 0
        gold.text = "${myPlayer.gold} gold"
    }


    val performTask = object : Runnable {
        override fun run() {
            val enemyHit = enemyAttack(myPlayer, myEnemy)
            // Call a function to stop this thread if the condition is met:
            if (myPlayer.takeDamage(enemyHit)) { //myPlayer.takeDamage returns true if hp <= 0
                playerDied()
                stopCombat() // called before declaration
                mainHandler.removeCallbacks(this) // tried, doesn't work
            }
            playerHP.text = "${myPlayer.currentHitPoints} / ${myPlayer.maxHitPoints}"
            combatLog.append("${myEnemy.name} deals $enemyHit damage!\n")
            mainHandler.postDelayed(this, 3000)
        }
    }

    fun stopCombat(){
        mainHandler.removeCallbacks(performTask)
    }

我注意到您正在使用 kotlin。我认为你可以使用协程。它更简洁、更轻便。 Cancellation and Timeouts

如果你还想用thread。试试下面的代码。

    val executorService = Executors.newSingleThreadExecutor()
    val runnables = Runnable {

    }
    val task = executorService.submit(runnables)
    task.cancel(true)

设置一个布尔值以确定您是否要再次 post runnable


override fun run() {
    val enemyHit = enemyAttack(myPlayer, myEnemy)
    val died = myPlayer.takeDamage(enemyHit)) 
    if (died) 
        playerDied()
   playerHP.text = "${myPlayer.currentHitPoints} / ${myPlayer.maxHitPoints}"
            combatLog.append("${myEnemy.name} deals $enemyHit damage!\n")
    if (!died)
        mainHandler.postDelayed(this, 3000)
}

抱歉格式化 - 在我的 phone 上。