Kotlin Класс обработчика: как остановить поток - изнутри run () - когда условие выполнено? - PullRequest
0 голосов
/ 19 февраля 2020

В настоящее время я учусь разрабатывать android приложений. Для моего первого приложения я хотел создать простой кликер с примитивной боевой системой.

В своем коде я создал экземпляр обработчика и запускаемый объект, Внутри этого «задержанного l oop» противник атакует экземпляр игрока каждые 3 секунды, нанося урон. Внутри l oop я также проверяю, когда hp игрока меньше или равен 0 ; когда условие выполнено, я хочу остановить работающий объект .

Как мне это сделать? Я пытался вызвать функцию stopCombat(), которая содержит Handler.removeCallbacks, но я не могу вызвать функцию до объявления. Я попытался поместить .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)
    }

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Установите логическое значение, чтобы определить, собираетесь ли вы публиковать исполняемый файл снова


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)
}

Извините за форматирование - на моем телефоне.

1 голос
/ 19 февраля 2020

Я заметил, что вы используете kotlin. Я думаю, что вы можете использовать сопрограммы. Это более сжатый и легкий. Отмена и время ожидания

Если вы все еще хотите использовать поток. Попробуйте следующий код.

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

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