kotlin-- 协程(coroutine)

305 阅读2分钟

「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

一、协程概念

协程是一种轻量级线程。协程提供了一种避免线程阻塞、开销小的异步操作。

协程可以被挂起而不是阻塞线程,线程的挂起几乎没有代价,它不需要切换上下文。

  • 添加依赖包
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2-native-mt'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2-native-mt'

二、函数分析

1. launch

不会阻塞当前线程,返回一个协程的引用

  • context:协程的上下文有 4种线程模式:
    • Dispatchers.Default
    • Dispatchers.IO
    • Dispatchers.Main - 主线程
    • Dispatchers.Unconfined - 没指定,就是在当前线程
  • start: 启动模式,默认是DEAFAULT,也就是创建就启动:
    • DEAFAULT
    • ATOMIC
    • UNDISPATCHED
    • LAZY - 懒加载模式,你需要它的时候,再调用启动
  • block: 闭包方法体,定义协程内需要执行的操作
  • Job: 协程构建函数的返回值,可以把 Job 看成协程对象本身,协程的操作方法都在 Job 身上了
    • job.start() - 启动协程,除了 lazy 模式,协程都不需要手动启动
    • job.join() - 等待协程执行完毕
    • job.cancel() - 取消一个协程
    • job.cancelAndJoin() - 等待协程执行完毕然后再取消
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
    val newContext = newCoroutineContext(context)
    val coroutine = if (start.isLazy)
        LazyStandaloneCoroutine(newContext, block) else
        StandaloneCoroutine(newContext, active = true)
    coroutine.start(start, coroutine, block)
    return coroutine
}

具体使用:

GlobalScope.launch { 
  println("Hello World!") 
}
2. runBlocking

等待协程的代码执行结束,再执行剩下的代码,如果任务是非常耗时的操作时,会一直阻塞当前线程,在实际开发中很少会用到runBlocking

3. suspend
  • 协程挂起就是切个线程,在挂起函数执行完毕之后,协程会自动的重新切回它原先的线程
  • 是函数创建者对函数调用者的提醒,需要用挂起的方式在协程中使用,把内容用withContext包起来
4. async
5. withContext