android - 如何同步协程?

标签 android kotlin kotlin-coroutines

我试图确保这两种方法是同步的。我注意到协程比线程更难同步。如果我调用start(),我如何保证?然后 stop()我的代码实际上会在最后停止吗?

object Test {

    private val coroutine = CoroutineScope(Dispatchers.IO)

    @Synchronized
    fun start() {
        coroutine.launch {
            // some work
        }
    }

    @Synchronized
    fun stop() {
        coroutine.launch {
            // clean up then stop
        }
    }
}

我担心的是我调用 start()然后 stop()但实际上 stop 先执行。所以我的代码在它应该停止的时候继续。

最佳答案

命令的同步或顺序执行是两件不同的事情。
如果您需要执行“开始”然后“停止”,只需不要使用您的“coroutine.launch”创建新的协程,而是为您的函数使用暂停关键字,然后像这样执行它们:

suspend fun start() {}

suspend fun stop() {}

fun main() {
    scope.launch {
        start()
        stop()
    }
}
但是如果你想同步两种方法,你可以阅读 an official Kotlin guide to shared mutable state这提出了一些很好的解决方案。并做一些这样的想法:
val mutex = Mutex()

suspend fun main() {
    mutex.withLock {
        start()
        stop()
    }
}

关于android - 如何同步协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59998741/

相关文章:

安卓应用程序启动器图标

android - 带有 JSON.NET 的包非常大

android - 如何在 login.vue 中添加标题?

kotlin - 我怎样才能在 Kotlin 中什么都不做?

android - Mockito Stubbed Spy 有时会调用有时不会调用被侦测对象的方法

kotlin - 如何从 Kotlin 的回调中分离 'hot' 事件流?

java - 从数组中挑选项目

spring-boot - Kotlin 数据类 No String-argument constructor with spring data rest

android - 协程CancellationException预期行为

android - Android Room 在继续下一行之前是否等待 withTransaction block 完成