如何在Kotlin中启动协程而不等待其完成?

bgtovc5b  于 12个月前  发布在  Kotlin
关注(0)|答案(2)|浏览(165)

我想在Kotlin协程的帮助下以“解雇和遗忘”的方式运行一个作业。
这意味着我想生成一个进程,而对它的完成不感兴趣。
我发现我可以

GlobalScope.launch {
        ...
    }

字符串
同时在docs中不鼓励使用GlobalScope
有没有什么最佳做法可以做到这一点?
一些简单的东西,比如

CompletableFuture.runAsync(() -> { ... });


executorService.submit(() -> { ... });

zzoitvuj

zzoitvuj1#

不鼓励使用GlobalScope的原因是,通常您关心长时间运行的操作的范围,并且希望在工作超出您在应用程序中执行的操作范围时有一种简单的方法来取消工作,这样您就不会浪费资源和内存。
如果你有一个任务,你想能够激发和忘记,没有情况下,你会需要自动取消它沿着与其他类似的任务,你已经开始,那么GlobalScope是合适的。即使你想取消它在某种情况下,你仍然可以这样做,如果你保持引用的作业返回launch和取消。
这通常是一种罕见的情况,因此不鼓励使用GlobalScope。通常,您有应用的作用域。例如,在具有UI的应用中,您有一个屏幕,您希望在其中加载和显示某些数据。您希望当用户导航离开该屏幕时,与这些任务相关的所有工作都被取消,因此GlobalScope不适合。相反,你会有自己的CoroutineScope与该屏幕相关联,当屏幕关闭时,你会取消它。例如,在Android上,这个作用域已经为你提供了,并且已经设置为在适当的事件中取消自己-它被称为lifecycleScope

izkcnapc

izkcnapc2#

你可以对Job使用DNC块。它返回Deferred,这是一个有结果的Job。但关键是你不需要等待它的完成。对于下面的例子,它首先打印“kotlinx.coroutines.DeferredCoroutine”,没有任何延迟,然后在3秒后打印“false”。因为它等待它。

fun main() {
    val job1 = GlobalScope.async { longJob1() }
    val job2 = GlobalScope.async { longJob2() }
    println(job1)
    println(job2)
    println("Run without concerning yourself with whether the jobs are done.")
}

suspend fun longJob1(): Boolean {
    println("longJob1 has started")
    delay(3000)
    return true
}

suspend fun longJob2(): Boolean {
    println("longJob2 has started")
    delay(3000)
    return false
}

字符串
结果在下面。它不会等待3秒打印最后一条消息

DeferredCoroutine{Active}@7b49cea0
DeferredCoroutine{Active}@887af79
Run without concerning yourself with whether the jobs are done.
longJob1 has started
longJob2 has started

相关问题