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 上。
我目前正在学习如何开发 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 上。