科特林的Coroutine简介
#编程 #kotlin #android #coroutine

Introduction to Coroutine in Kotlin

coroutine是轻巧的执行线,以后可以暂停并恢复。已经有很多文章或主题涵盖了这一点,但是这篇文章是不同的,它很简单,可以让您更轻松地开始。它将覆盖以下部分:

概述

像许多其他编程语言一样,例如JS,Python,Coroutine是Kotlin提供的功能,使我们能够执行长时间且耗时的任务。简而言之:

在Kotlin中,Coroutines是一种以更顺序,易于阅读的方式编写异步,非阻滞代码的方法。

实际上,这里没有什么新技术。我们可以将Kotlin Coroutine视为一个框架/库,在处理异步时封装了一些常见用法。

在Kotlin中使用Coroutines的简单示例

要在Kotlin使用Coroutines,您需要在项目中包括kotlinx-coroutines-core库。在您的应用Gradle文件中(Intellij项目下只有一个Gradle文件,或者如果是Android项目,请选择应用程序的Gradle文件),添加以下行:

dependencies {
    testImplementation(kotlin("test-junit"))
    implementation(kotlin("stdlib-jdk8"))
    // add coroutine dependency
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2")
}

然后,您可以使用suspend关键字将函数标记为coroutine,并使用launchasync函数来启动coroutine。

1.使用launch创建Coroutines

这是使用Coroutine在背景中执行长期运行任务的示例:

import kotlinx.coroutines.*

fun main() {
    // Start a coroutine using the launch function
    val job = GlobalScope.launch {
        // Perform a long-running task in the background
        delay(1000L)
        println("Hello, world!")
    }

    // Wait for the coroutine to finish
    runBlocking {
        job.join()
    }
}

https://gist.github.com/arkilis/6cdd2d4ad1d30e5852cd1a46210833e0

在此示例中,launch函数在后台启动了一个coroutine,并返回一个可以用来等待coroutine完成的Job对象。 delay函数是悬浮函数,可在给定的时间内悬挂coroutine。

2.使用async创建Coroutines

这是一个在Kotlin中使用Coroutines并行执行多个任务的示例,然后等待所有任务完成:

import kotlinx.coroutines.*

fun main() {
    // Start two coroutines using the async function
    val job1 = GlobalScope.async {
        // Perform a long-running task in the background
        delay(1000L)
        println("Task 1")
    }

    val job2 = GlobalScope.async {
        // Perform a different long-running task in the background
        delay(2000L)
        println("Task 2")
    }

    // Wait for both coroutines to finish
    runBlocking {
        job1.await()
        job2.await()
    }
}

在此示例中,async函数用于在后台启动两个coroutines。 await功能用于等待Coroutines完成。因为坐标正在同时运行,所以任务是并行执行的,并且输出按任务完成的顺序打印。

启动和异步之间的区别

它们两个通常用于启动Coroutine。两者之间的主要区别在于,launch返回工作(不可取消的未来),并且不返回结果,而async返回了延期(不可取消的未来未来,结果)可用于获得Coroutine的结果。考虑到差异,何时应该使用启动和异步来创建coroutines:

  • 当您使用launch函数时,Coroutine将在后台运行,功能调用将立即返回。当不需要Coroutine的结果时使用它。
  • 当您使用async函数时,coroutine也将在后台运行,功能调用将立即返回,但是它将返回一个Deferred对象,您可以在其上调用.await()函数以获取coroutine的结果。当需要Coroutine的结果时使用它。例如:
val result = GlobalScope.async {
        return@async URL("https://api.example.com/data").readText()
    }
val data = result.await()
println(data)
// output: {"fact":"A group of cats is called a \u201cclowder.\u201d","length":38}

概括

Coroutines可以使在Kotlin中编写并发和同步代码更容易,而是一些尖端技术,而是Kotlin提供的线程包装。

还有什么?众所周知,Coroutine是一个很大的话题,很少有人可以解释所有问题。这是Coroutine系列的第一篇文章。如果您有兴趣,请订阅有关此信息的更多文章:

要了解有关Coroutines以及如何使用它们的更多信息,您可以在https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html上阅读官方文档。