暂停正在运行的协程

时间:2019-11-11 14:53:26

标签: android kotlin kotlin-coroutines

我可以通过在协程内部调用suspendCoroutine<String> { cont -> continuation = cont }来暂停协程,但是如何从协程外部暂停协程并在以后继续进行恢复呢?

编辑:

协程的工作是使用杰克逊流式API从服务器接收json消息,并使用sqlite存储它们,并且如果回调不为null(活动正在运行),还向活动通知新消息

现在,当服务(包含协程)已经在运行并且正在更新数据库时,如果活动连接到它,我希望活动首先从数据库中获取所有消息,然后继续从服务中接收新消息。

问题:

  • 如果我在活动同步数据库中的消息时让协程运行,则新消息可能无法完全/正确地同步,或者最终终止于旧消息的中间,原因是我希望协程暂停直到同步完成。

  • 我无法检查我是否应该暂停协程,在之前,杰克逊开始等待新消息,它将迅速通过此条件。

  • 我无法检查我是否应该在杰克逊等待来自网络的新消息时暂停协程(读取时被阻止),所以无法完成。

  • 我无法检查我是否应该在杰克逊收到消息后暂停协程,因为那样我就必须等待新消息开始同步。

编辑2:

我认为最好的解决方案是开始同步并添加一个检查活动是否已经同步在接收数据之后,进行任何回调或将数据存储到数据库之前,这样,协程可以自由地阻止读取,并且在活动完成同步之前不插入新数据。

1 个答案:

答案 0 :(得分:0)

我假设您打开的是两个不同的协程,而不是一个,这使您可以0控制哪个首先运行:

您只需要在一个协程内部完成所有工作,就可以像命令式编程那样执行它:

cbManager.scanForPeripherals(withServices: [myDiscoveredService], options: nil)

应该就是这样,根据您的描述。