【问题标题】:How to interrupt Kotlin suspend function in coroutines and start over如何在协程中中断 Kotlin 挂起功能并重新开始
【发布时间】:2021-05-31 03:23:23
【问题描述】:

长话短说,我正在运行 java/kotlin 项目,我正在寻找一种方法来取消 kotlin 挂起功能并在情况发生变化时重新启动协程。在我的代码中,我可以让 100 个播放器(协程)同时运行,并带有挂起功能等,并且每小时或每 x 次 Java 调用其中一些播放器。当它发生时,我需要协程停止该挂起功能并再次启动协程。代码如下:

internal suspend fun update() {
    doesCoolStuff()
    goesSomewhere()
    delay 20sec
    GoesSomewhereElse()
    delay 60sec
    GoesSomewhereElsex2()
    delay 100sec
    }

private suspend fun GoesSomewhereElse() {
doesThings()
delay 2 mins
}

等等。我的问题是,当java延迟调用暂停函数内部的播放器时,它会从java执行操作,然后等待延迟用完,然后再开始执行协同程序开始处的CoolStuff。 所以基本上我需要一些东西来中断挂起功能并取消所有延迟并从协程开始。像“return”函数,可以在协程中使用,从Java返回开始并重新开始。

编辑: 当时间到来,Java 调用播放器。它还做了一些其他的事情,比如传送玩家、更改名称、将他添加到活动团队。如果那个玩家当时正在做某事,那很好,它会从头开始重置 couroutine,我有一个如果玩家在事件中它做的东西。 效果很好,但是如果玩家处于 3 分钟延迟的中间,则它代表这 3 分钟的剩余时间。在它回到协同程序的开始之前,它意识到它正在发生并且必须做一些事情。

【问题讨论】:

  • 我们需要更多地了解这个Java播放器。它是否提供任何中断动作的方法?也许您可以指定确切的库或类。
  • 刚刚更新了更多关于 java 调用的信息。希望它有所帮助。
  • 这并不能回答我的意思。播放器的 API 是否允许您通过方法调用中断您开始的内容?你可以取消一个协程,但是如果玩家的状态不配合取消,那么玩家仍然会做你告诉它的任何事情。

标签: java kotlin kotlin-coroutines


【解决方案1】:

继续参考Job:

var job: Job? = null


job?.cancel()
job = coroutineScope.launch { aSuspendFunction() }


【讨论】:

  • 我无法在项目的 kotlin 部分之外使用它。在这种情况下,当项目的 Java 端执行操作时,我需要中断。理想情况下,它不应该取消整个协程,只需中断挂起函数并重新开始。
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2020-11-22
  • 1970-01-01
  • 2021-12-22
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多