kotlin协程之上下文

  • CoroutineContext是一组用于定义协程行为的元素

  1. Job:控制协程的生命周期
  2. CoroutineDispatcher:向合适的线程分发任务
  3. CoroutineName:协程的名称,调试的时候很有用
  4. CoroutineExceptionHandler:处理未被捕捉的异常
  • 协程上下文继承

对于新创建的协程,它的CoroutineContext会包含一个全新的Job实例,它会帮助我们控制协程的生命周期,而剩下的元素会从CoroutineContext的父类继承,该父类可能是另外一个协程或者创建该协程的CoroutineScope。

 val b = runBlocking {
        val scope = CoroutineScope(Job()+Dispatchers.IO+CoroutineName("test"))
       val job= scope.launch {
           //新的协程会将CoroutineScope作为父级
            println("${coroutineContext[Job]} ${Thread.currentThread().name}")
           val result = async {
               //通过async创建的新协程会将当前协程作为父级
               println("${coroutineContext[Job]} ${Thread.currentThread().name}")
           }.await()
        }
        job.join()
    }

输出结果:
25023-25103 I/System.out: StandaloneCoroutine{Active}@1b69ce5 DefaultDispatcher-worker-2
25023-25102 I/System.out: DeferredCoroutine{Active}@cacc3ba DefaultDispatcher-worker-1

协程上下文 = 默认值 + 继承的CoroutineContext +参数

  • 一些元素包含默认值:Dispatchers.Default 是默认的CoroutineDispatcher,以及“coroutine”作为默认的CoroutineName;
  • 继承的CoroutineContext 是CoroutineScope或者其福鞋城的CoroutineContext;
  • 传入协程构建器的参数的优先级高于继承的上下文参数,因此会覆盖对应的参数值。
  val b = runBlocking {
        val coroutineExceptionHandler = CoroutineExceptionHandler { _, exception ->
            println("Caught $exception")
        }
        val scope = CoroutineScope(Job() + Dispatchers.Main + coroutineExceptionHandler)
        val job = scope.launch(Dispatchers.IO) {//在此指定的Dispatchers.IO,会覆盖Dispatchers.Main
            //新的协程会将CoroutineScope作为父级
            println("${coroutineContext[Job]} ${Thread.currentThread().name}")
        }
        job.join()
    }

你可能感兴趣的:(kotlin协程之上下文)