Kotlin协程介绍(三)创建协程 launch

通过Kotlin协程介绍(二)我们知道协程会将挂起函数(suspend函数)在编译期转换为CPS,suspend函数只能在协程或者另一个suspend中运行,那么如何创建一个协程呢?

CoroutineScope.launch

可以通过GlobalScope.launch创建并立即启动一个协程

GlobalScope.launch {
    val start = System.currentTimeMillis()
    println("start")
    delay(1000) //协程内可以调用suspend函数
    println("end ${System.currentTimeMillis() - start}")
}

我们看一下launch的函数定义

public fun CoroutineScope.launch(
    context: CoroutineContext,
    start: CoroutineStart,
    block: suspend CoroutineScope.() → Unit
): Job

launch是一个CoroutineScope的扩展函数,CoroutineScope代表协程的作用域,持有一个CoroutineContext。coroutineContext类似Thread-local的概念,用于在协程中共享某些环境变量。

public interface CoroutineScope {

    public abstract val coroutineContext: kotlin.coroutines.CoroutineContext

}

launch的第一个参数接受一个CoroutineDispatcher(CoroutineContext的子类),通过CoroutineDispatcher可以指定运行协程的线程或者线程池。例如,我们可以通过Dispatcher指定协程运行在Android主线程,执行到delay时,协程挂起,Android主线程不会被阻塞,待delay执行结束会,协程将回复在主线程的执行。

launch(UI) { //UI是kotinx-coroutine-android提供的Dispatcher,协程会被分派到UI线程执行
    prograssBar.isVisible = true
    delay(1000)
    prograssBar.isVisible = false                                           
}

Job

launch启动协程后返回一个Job代表当前协程的句柄,通过Job.cancel()可以停止协程的运行。协程内可以启动子协程,子协程的Job通过Job.attachChild关联到父协程的Job,父Job的cancel会取消所有子协程。每个CoroutineScope都有一个根节点Job,其内部launch的所有协程都是其子Job。我可以自定义CoroutineScope,通过根Job管理所有协程的生命周期,比如在android的viewmodel中,我们可以在viewmodel的onCleared时cancel其所有子协程

class MyViewModel : ViewModel() {

    private val viewModelJob = SupervisorJob()
    
    private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
    
    override fun onCleared() {
        super.onCleared()
        viewModelJob.cancel() // Cancel 当前scope下的所有协程
    }
    
    fun launchDataLoad() {
        uiScope.launch {
            sortList()
        }
    }
    
    suspend fun sortList() = withContext(Dispatchers.Default) {
        // Heavy work
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kotlin协程是一种用于实现轻量级、非阻塞并发的编程框架。它允许您以顺序的方式编写异步代码,同时提供了一种简单的方式来管理和组织协程的执行。 在Kotlin中,协程的管理是通过CoroutineScope来实现的。CoroutineScope是一个接口,用于定义协程的作用域。通过实现CoroutineScope接口,您可以在作用域内启动和管理协程。 为了创建一个协程作用域,您可以使用CoroutineScope的构造函数,并为其提供一个CoroutineContext。CoroutineContext是一个上下文对象,它包含了协程的执行环境和其他相关信息。在协程作用域中,您可以使用该上下文对象来控制协程的行为。 一旦您创建协程作用域,您可以使用该作用域来启动协程。通过调用CoroutineScope的launch或async函数,您可以在作用域内启动一个新的协程。这些函数将返回一个Job对象,您可以使用该对象来管理和控制协程的执行。 在协程作用域中,您还可以使用CoroutineScope的其他函数来管理协程的生命周期。例如,您可以使用cancel函数来取消作用域内的所有协程,使用join函数来等待所有协程的完成。 总结起来,Kotlin协程的管理是通过CoroutineScope来实现的。通过实现CoroutineScope接口并使用其函数,您可以在作用域内启动和管理协程的执行。使用CoroutineScope的构造函数和上下文对象,您可以控制协程的行为。同时,您还可以使用其他函数来管理协程的生命周期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fundroid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值