#java #kotlin #kotlin-coroutines
Вопрос:
короче говоря, у меня запущен проект java/kotlin, и я ищу способ отменить функцию приостановки kotlin и запустить сопрограмму заново, если обстоятельства изменятся. в моем коде у меня могло бы быть 100 игроков ( сопрограмм), работающих одновременно с функциями приостановки и т. Д., И Ежечасно или каждый раз, когда Java вызывает некоторых из этих игроков. когда это произойдет, мне понадобится сопрограмма, чтобы остановить эту функцию приостановки и снова запустить сопрограмму. код выглядит так, как показано ниже:
internal suspend fun update() {
doesCoolStuff()
goesSomewhere()
delay 20sec
GoesSomewhereElse()
delay 60sec
GoesSomewhereElsex2()
delay 100sec
}
private suspend fun GoesSomewhereElse() {
doesThings()
delay 2 mins
}
и т.д. Моя проблема в том, что когда java вызывает плеер, который находится внутри функции suspend с задержкой, он выполняет действие из java, а затем стоит и ждет, пока закончится задержка, прежде чем начать делать CoolStuff, который находится в начале сопрограммы.
так что в принципе мне нужно что-то, чтобы прервать функцию приостановки и отменить все задержки и запустить сопрограмму заново. например, функция «возврат», которую можно использовать в сопрограмме, чтобы вернуться к началу и начать все сначала только с Java.
ПРАВКА: когда придет время и Java вызовет плеер. он делает еще пару вещей, таких как телепортирует игрока, меняет имя, добавляет его в команду событий. и если этот игрок в то время что-то делает, все в порядке, он сбрасывает курс, начиная с самого начала, когда у меня есть игрок if, если он что-то делает. что хорошо работает, однако, если игрок находится в середине 3-минутной задержки, он остается в силе в течение оставшегося времени этих 3 минут. прежде чем он вернется к началу сопрограммы, где он поймет, что он находится в событии и должен что-то делать.
Комментарии:
1. Нам нужно узнать больше об этом Java-плеере. Предоставляет ли это какой-либо способ прервать действие? Возможно, вы можете указать точную библиотеку или класс.
2. просто обновил дополнительную информацию, касающуюся вызова java. надеюсь, это поможет.
3. Это не отвечает на то, к чему я клоню. Позволяет ли API плеера прерывать то, что вы начали, с помощью вызова метода? Вы можете отменить сопрограмму, но если состояние игрока не согласуется с отменой, то игрок все равно будет делать все, что вы ему скажете.
Ответ №1:
Держите ссылку на Job
:
var job: Job? = null
job?.cancel()
job = coroutineScope.launch { aSuspendFunction() }
Комментарии:
1. Я не смог использовать это за пределами части проекта kotlin. и в этом случае мне понадобилось бы прерывание, когда Java-сторона проекта выполняет действие. Также в идеале он не должен отменять всю сопрограмму, просто прерывать функцию приостановки и начинать все сначала.