首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >协程简单上手(线程切换)

协程简单上手(线程切换)

作者头像
小柔
发布于 2022-10-09 04:12:56
发布于 2022-10-09 04:12:56
73100
代码可运行
举报
文章被收录于专栏:小柔博客园小柔博客园
运行总次数:0
代码可运行

theme: condensed-night-purple

上一篇文章中我们分析了挂起函数的本质(状态机),以及查看编译器为我们生成的类里面是如何借用状态机实现的“挂起”,那么在实际coding中我们该如何使用协程呢?

协程作用域

所有协程都必须在一个协程作用域CoroutineScope内运行。一个 CoroutineScope 管理一个或多个相关的协程。

协程如何开启呢?可以通过launch和async函数创建协程并将其函数主体的执行分派给相应的调度程序

调度程序也就是launch和async的函数主体会运行在哪个线程中。比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
launch(Dispatchers.IO){
     //协程主体函数
}

Dispatchers.IO 指示此协程应在为 I/O 操作预留的线程上执行。

那么当协程内部还需要切换线程的时候呢?典型的场景比如开启协程获取数据需要进行不同的线程切换: 这时候可以使用withContext

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
withContext(Dispatchers.IO) {
            // IO线程运行
        }

当withContext运行完成之后会自动恢复调用withContext的线程中。

如何看阻塞

同一协程体内的代码是阻塞的,但是协程体里面又开启了一个协程,两个协程不影响各自运行,但父协程取消的时候默认子协程也会取消。

取消协程运行

不管是通过launch还是async开启的协程,其都会返回一个Job对象,调用该Job对象的cancel即可取消协程。协程内部会通过抛出一个取消异常终止运行。

上面是针对某一个具体的协程取消,如果我想全部取消呢?比如界面销毁的时候,通过调用协程域的取消,位于这个协程域里面的协程都会取消。 Android为我们自动提供了一个viewmodelScope,他可以在配置改变引起的销毁重建时自动取消开启协程不用担心泄漏问题。

CoroutineContext

CoroutineContext 使用以下元素集定义协程的行为:代表该协程的上下文信息比如协程的名称,协程的调度器(Dispatcher),异常处理等

  • Job:控制协程的生命周期。
  • CoroutineDispatcher:将工作分派到适当的线程。
  • CoroutineName:协程的名称,可用于调试。
  • CoroutineExceptionHandler:处理未捕获的异常。协程如何测试 开启协程 runTest 是用于测试的协程构建器。相比于正式编码的时候使用的是launch和async。使用此构建器可封装包含协程的任何测试。必须使用指定调度器 通过TestDispatchers调度器来指定协程的运行线程,相比于正式编码使用的是Dispatchers.IO,Dispatchers.Main,Dispatchers.Default。 除 runTest 创建的顶级协程外,如果代码还创建了新的协程,则需要选择适当的 TestDispatcher,以控制这些新协程的调度方式,设置新协程的调度器。 TestDispatchers是用于测试的 [CoroutineDispatcher] 实现。由于多线程下的测试是不可预测的,所以正式编码中出现的withContext切换线程应换成单线程的方式因为这样将会使得结果可预测,所以再项目中不能使用硬编码去设置调度器Dispatchers,应该使用注入的方式如果是测试注入TESTDispatchers,如果是正式注入正常的Dispatcher。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~
前段时间一直在学习 Compose,所以导致 Kotlin 笔记系列搁置了好久。一方面是因为 Compose 的学习在个人来看重要性更高;另一方面就是,发现学完之前的 Kotlin 系列的笔记一到笔记三后,已经基本可以在项目中使用 Kotlin 进行日常的编码了,所以才导致这个 Kotlin 学习笔记系列停更了好久,哈哈!对 Jetpack Compose 感兴趣的同学可以看一下我的另一个笔记系列—— Jetpack Compose 学习笔记。这次咱来看看 Kotlin 协程的基础知识。
修之竹
2022/08/19
1.7K0
Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~
6个Android Kotlin协程相关面试题
解答: runBlocking是一个协程构建器,它会立即启动协程并在当前线程阻塞,直到协程执行完成。这通常用于主函数或测试中,以同步方式执行异步代码。然而,runBlocking在Android中可能会导致主线程阻塞,从而影响UI的响应性,因此应谨慎使用。
AntDream
2024/11/19
7640
6个Android Kotlin协程相关面试题
Kotlin 协程实现原理解析
Kotlin 协程是一种在 Kotlin 语言中实现并发编程的强大工具。它提供了一种轻量级的线程管理方式,使得开发者能够以接近同步代码的方式编写异步代码。本文将深入探讨 Kotlin 协程的实现原理,并分析其关键源码。
用户9505469
2024/04/10
8080
Kotlin协程:理解主要概念
在Kotlin的协程世界中,我们经常会遇到coroutineScope,CoroutineScope,supervisorScope和withContext这些概念。这些概念在初次接触时可能会让人感到困惑,但理解它们对于有效地使用Kotlin协程至关重要。本文将深入探讨这些概念的含义和用法。
陆业聪
2024/07/23
2140
Kotlin协程:理解主要概念
Jetpack Compose - Effect与协程
在 Jetpack Compose 中,没有像传统 Android 中的生命周期函数那样的概念。
码客说
2024/03/29
3840
协程切换引发主线程卡顿?Dispatchers.IO的四个致命误区
大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴。
AntDream
2025/04/22
1870
协程切换引发主线程卡顿?Dispatchers.IO的四个致命误区
Android面试题之Kotlin协程一文搞定
由launch启动的协程用join()方法;用async启动的协程用await()
AntDream
2024/06/13
3110
Android面试题之Kotlin协程一文搞定
揭秘kotlin协程中的CoroutineContext
从kotlin1.1开始,协程就被添加到kotlin中作为实验性功能,直到kotlin1.3,协程在kotlin中的api已经基本稳定下来了,现在kotlin已经发布到了1.4,为协程添加了更多的功能并进一步完善了它,所以我们现在在kotlin代码中可以放心的引入kotlin协程并使用它,其实协程并不是kotlin独有的功能,它是一个广泛的概念,协作式多任务的实现,除了kotlin外,很多语言如Go、Python等都通过自己的方式实现了协程,本文阅读前希望你已经知道如何使用kotlin协程,如果不熟悉可以阅读一下官方文档:
做个快乐的码农
2022/02/07
2.1K0
揭秘kotlin协程中的CoroutineContext
Kotlin协程实现原理:ContinuationInterceptor&CoroutineDispatcher
新的一周开始了,大家继续干就完事了,同时感谢老铁们的支持! 今天我们继续来聊聊Kotlin的协程Coroutine。 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotli
Rouse
2020/11/17
1.8K0
Kotlin协程实现原理:ContinuationInterceptor&CoroutineDispatcher
笔记 | 初探Kotlin协程
warning: 这篇文章距离上次修改已过188天,其中的内容可能已经有所变动。
Ranlychan
2023/03/05
6350
再谈协程之CoroutineContext我能玩一年
CoroutineContext是Kotlin coroutines的一个基本构建模块。因此,为了实现线程、生命周期、异常和调试的正确行为,能够操纵它是至关重要的。
用户1907613
2021/11/12
8610
抽丝剥茧Kotlin - 协程
文章接上篇,这一篇我们好好聊一聊协程的原理,通过上一篇的学习,相信大家对于如何使用协程已经非常熟悉了。
用户1907613
2020/08/28
8780
Coroutines : First things first
该系列博客深入探索了协程的取消和异常。取消 可以避免进行预期以外的工作,从而节省内存和电量;合适的异常处理 可以带来良好的用户体验。作为该系列另外两篇文章的基础,通过本文搞清楚协程的一些基本概念,例如 CoroutineScope 、Job 、CoroutineContext 等,是非常重要的。
路遥TM
2021/08/31
7080
【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )
MainScope 是一个 函数 , 其返回值类型为 CoroutineScope 协程作用域 ; 这是使用了设计模式中的 工厂模式 , 生产一个 协程作用域 实例对象 ; 之后的 协程操作都要定义在该协程作用域中 ;
韩曙亮
2023/03/30
1.4K0
【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )
Kotlin协程上下文和异常处理
由于传入协程构建器的参数优先级更高,所以job的调度器被覆盖,是Dispatchers.IO而不是父类的Dispatchers.Main
AntDream
2024/06/13
1580
Kotlin协程上下文和异常处理
Kotlin协程解析系列(上):协程调度与挂起
本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建、协程调度与协程挂起相关的内容
2020labs小助手
2022/06/07
2.3K0
【Kotlin 协程】协程上下文 ( 协程上下文构成要素 | 指定协程上下文元素组合 | 协程上下文元素的继承关系 | 协程上下文元素的几种指定形式 | 默认 | 继承 | 自定义指定 )
使用 launch 或 async 协程构建器 启动 协程时 , 都要 指定一个 协程上下文 , 如果没有指定 , 则使用默认的 空的协程上下文 EmptyCoroutineContext ;
韩曙亮
2023/03/30
4580
【Kotlin 协程】协程上下文 ( 协程上下文构成要素 | 指定协程上下文元素组合 | 协程上下文元素的继承关系 | 协程上下文元素的几种指定形式 | 默认 | 继承 | 自定义指定 )
协程中的取消和异常 | 核心概念介绍
在之前的文章里,我们为各位开发者分享了在 Android 中使用协程的一些基础知识,包括在 Android 协程的背景介绍、上手指南和代码实战。本次系列文章 "协程中的取消和异常" 也是 Android 协程相关的内容,我们将与大家深入探讨协程中关于取消操作和异常处理的知识点和技巧。
Android 开发者
2020/05/27
1.1K0
协程中的取消和异常 | 核心概念介绍
Kotlin协程系列(二)
  在进行业务开发时,我们通常会基于官方的协程框架(kotlinx.coroutines)来运用Kotlin协程优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。所以,为了我们在后续的学习中游刃有余,在使用官方给出的复合协程时能够胸有成竹,我们暂且抛开它,按照它的思路实现一个轻量版的协程框架。
故乡的樱花开了
2023/11/28
3440
Android协程的7个必要知识点
在现代Android应用开发中,协程(Coroutine)已经成为一种不可或缺的技术。它不仅简化了异步编程,还提供了许多强大的工具和功能,可以在高阶场景中发挥出色的表现。本文将深入探讨Coroutine重要知识点,帮助开发者更好地利用Coroutine来构建高效的Android应用。
Rouse
2023/08/31
1.1K0
Android协程的7个必要知识点
推荐阅读
相关推荐
Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档