news 2026/5/25 22:54:04

kotlin 协程 入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
kotlin 协程 入门

作用域

协程的结构,首个要了解的就是作用域。

val scope = CoroutineScope(Dispatchers.IO) // 创建一个作用域 fun kotlinCoroutines(){ scope.launch { // {} 内代码执行区域(又叫协程体) // do something } }

作用域一如字面意思就是可以生效的范围,为了解决以往启动一个Activity中的子线程后进行耗时操作后,即使页面已经被销毁了依然执行导致执行完毕后的回调后报错的问题。这个作用域可谓至关重要。

现在只要在页面onDestroy时调用scope.cancel()就可以中断代码的执行了。作用域的功能:生命周期管理。

override fun onDestroy() { super.onDestroy() scope.cancel() }

Android平台 提供了几种常用的提前给好的作用域:

  1. lifecycleScope:绑定 Activity/Fragment 的生命周期,会在 Lifecycle 销毁时自动取消。
  2. viewModelScope:绑定 ViewModel 的生命周期,会在 ViewModel 销毁时自动取消。

其中 val scope = CoroutineScope(Dispatchers.IO) 中的 Dispatchers常用的有以下几种:

Dispatchers.MainAndroid 主线程,用于更新 UI
Dispatchers.IO网络请求、文件读写等 IO 密集型任务
Dispatchers.Default数据计算、排序等 CPU 密集型任务。默认线程数等于 CPU 核心数

挂起函数(suspend)

简单来说 withContext(Dispatchers.Main){} 就可以切换调度器(Dispatchers)

结合起来使用举例如下:

val scope = CoroutineScope(Dispatchers.IO) fun kotlinCoroutines(){ scope.launch { // 网络请求、数据操作等耗时操作 makeLoginRequest() // 切换到主线程 withContext(Dispatchers.Main){ updateUI() // 更新UI } } }

挂起函数执行完毕后才能继续执行下面的代码。以上scope.lacunch{}协程体中的代码是顺序执行的! 点进withContent函数内部是加了suspend。

其中await() 和awaitAll()很好用

以前也有遇到情况就是几个接口要同时请求完毕才能结束,很丑陋,对吧?

var A = false var B = false var C = false ARequestNetWork(){ ... A = ture if( A && B && C ) {next()} } BRequestNetWork(){ ... B = ture if( A && B && C ) {next()} } CRequestNetWork(){ ... C = ture if( A && B && C ) {next()} }

可以改成这样,当然,saync中的函数的ARequestNetWork()也都要改造成适配协程的,你直接在启动一个子线程协程还是无法感知的。

coroutineScope { val deferredA = async { ARequestNetWork() } val deferredB = async { BRequestNetWork() } val deferredC = async { CRequestNetWork() } deferredA.await() deferredB.await() deferredC.await() next() }

这样写使用 awaitAll 更加简洁

coroutineScope { awaitAll{ async { ARequestNetWork() } async { BRequestNetWork() } async { CRequestNetWork() } } next() }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 4:37:47

K8s-1.29.2二进制安装-第一章

从本章来完成安装k8s学习的最后一种安装方式(二进制安装),系统使用Rockly9.6,K8s版本1.29.2,一共会分成几张进行编写。1. 安装Topo2.环境初始化 1、镜像下载(所有节点) # 官方下载地址 https://rockylinux.org/download # 阿里云镜像下载地址…

作者头像 李华
网站建设 2026/5/26 4:35:43

【2025最新】Honeyview下载安装教程:快速上手这款高效图片浏览器

前言 在日常处理大量图片的工作中,一款轻量、启动快、支持多种格式的图片浏览工具能够极大提高效率。Honeyview作为一款深受技术用户喜爱的图片浏览软件,以其“轻、快、兼容性强”的特点脱颖而出。 本文将为你详细讲解Honeyview的下载安装全过程&#x…

作者头像 李华
网站建设 2026/5/26 4:41:50

AI 扩图:从像素填充到场景延伸的技术逻辑

在数字内容生产中,用户常面临“图片尺寸不足”的痛点——从电商产品图需要高清放大,到老照片修复需要延伸场景,传统像素填充方法早已难以满足精细化需求。比如传统双线性插值处理1080P图片时,PSNR(峰值信噪比&#xff…

作者头像 李华
网站建设 2026/5/26 4:41:50

CentOS7/8在线yum源自动设置

1. 前提说明CentOS7/8版本官方已经归档,默认的安装源无法使用,而且网上大多数提供的国内yum地址也大部分失效。故为了快速有效的使用在线yum,结合国内清华源,来生成有效的repo文件,帮助实施人员解决手动配置慢等问题。…

作者头像 李华
网站建设 2026/5/26 2:55:40

12月31日截止!2026年个税专项扣除确认

动动手明年工资可能变多哦~确认时间:12月1日—12月31日一定要记得操作!错过的话明年1月起单位会暂停扣除,到手工资可能变少,后续补办超麻烦!手机APP操作指南(个人所得税APP)&#xf…

作者头像 李华
网站建设 2026/5/26 5:34:35

C进阶之内存对齐,硬件总线和高并发伪共享的底层原理

在 C 语言的面试和实际开发中,sizeof 是一个出现频率极高的关键词。初学者往往认为它只是用来计算变量占用空间的,但实际上,sizeof 的背后隐藏着CPU 架构、硬件总线甚至高并发性能的秘密。 今天,我们不注重于对齐规则,…

作者头像 李华