【Android Kotlin】Kotlin协程介绍

协程简介

Kotlin中的协程(Coroutines)是一种轻量级的并发框架,用于简化异步编程和并发任务。它提供了简洁的语法和强大的功能,允许开发者以顺序代码的方式编写异步操作。协程可以挂起并恢复,从而避免了传统回调地狱问题,并且可以轻松实现并发、异步、并行操作。

协程的优点

1、简化异步代码 :以同步的方式编写异步代码,消除回调地狱

2、轻量级 :一个线程可以运行成千上万的协程,减少线程创建和切换的开销

3、结构化并发:协程帮助管理并发任务的生命周期,避免资源泄露

协程核心内容

1、协程作用域

CoroutineScope,管理协程的生命周期,通过作用域,可以启动新的协程并控制它们的执行环境,常规业务使用。

GlobalScope全局作用域,可以启动全局范围的协程,生命周期与应用程序的生命周期相同,除非手动取消,GlobalScope适用一些需要长时间运行,甚至跨越整个应用程序生命周期的协程,如某些后台服务或全局的监控任务。

2、协程句柄

Job用于管理协程的生命周期,可以通过cancel取消协程以及检查状态(比如isActiveisCancelledisCompleted

DeferredJob的子类接口,一种特殊的Job,代表可以返回结果的协程,通过await方法可以获取协程执行的结果。

3、协程调度器

协程调度器Dispatcher决定协程在哪个线程或线程池中执行,常用的调度器有:

Dispatchers.Main:在主线程中执行,用于更新UI。

Dispatchers.IO : 用于IO操作,做耗时操作,如文件读写、网络请求。

Dispatchers.Default :用于CPU密集型操作,如计算。

Dispatchers.Unconfined:不限制协程运行在哪个线程。

4、协程启动方式

launch :启动一个新协程并返回一个Job、用于不需要返回结果的任务,不会阻塞当前线程。

kotlin 复制代码
GlobalScope.launch {
    delay(2000)
    println("协程执行完成")
}

async :启动一个新协程并返回一个Deferred对象,用于返回结果,不会阻塞当前线程。

kotlin 复制代码
GlobalScope.launch {
 val result = async {
        delay(2000)
        "业务结果"
    }
   println("打印返回: ${result.await()}")  //打印返回业务结果
}

runBlocking:启动一个协程并阻塞当前线程,直到协程完成,不建议在UI线程中使用。

kotlin 复制代码
runBlocking {
 	delay(2000)
    println("阻塞等协程完成")
}

5、挂起函数

挂起函数是Kotlin协程的核心特性,允许函数在不阻塞线程的情况下暂停执行,常见的挂起函数包括:

delay:非阻塞暂停协程一定的时间

kotlin 复制代码
 private suspend fun loadData() {
      delay(2000)
      println("数据完成加载")
}

withContext :在指定的 Dispatcher 中切换上下文,执行代码。

kotlin 复制代码
private suspend fun loadData(){
     withContext(Dispatchers.IO){
         //在IO线程中执行任务
     }
 }
 

6、结构化并发

Kotlin协程可以通过结构化并发管理协程生命周期,结构化并发意味着协程的生命周期由它们父级协程作用域来控制,父协程完成或被取消时,所有的子协程也会自动取消,这保证了协程执行过程的可控性,不会导致资源泄露。

kotlin 复制代码
val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)

7、异常处理

Kotlin协程通过try-catch块来处理协程中的异常,或者通过CoroutineExceptionHandler来处理未捕获的异常。

kotlin 复制代码
 GlobalScope.launch {
     try {
         //执行可能抛出异常的代码
     }catch (e:Exception){
         //处理异常
     }
 }
 

8、取消协程

协程是可以被取消的。当你调用 cancel方法时,协程会尝试取消自身,并在下次挂起点检查取消状态

kotlin 复制代码
val job = GlobalScope.launch {
    repeat(1000) {
        if (isActive) { // 检查协程是否活跃
            println("业务执行中")
            delay(500)
        }
    }
}

// 取消协程
job.cancel()

总结

Kotlin协程的核心内容涵盖了协程的基本概念、构建块、启动方式、挂起函数、结构化并发、异常处理以及协程的取消机制。协程通过提供一种轻量级的并发编程模型,使得处理异步任务更加直观和简洁,同时保持代码的可读性和可维护性。它们在Android开发中得到了广泛应用,尤其是在需要处理复杂的异步操作时。

相关推荐
serve the people1 小时前
解决osx-arm64平台上conda默认源没有提供 python=3.7 的官方编译版本的问题
开发语言·python·conda
柒七爱吃麻辣烫1 小时前
在Linux中安装JDK并且搭建Java环境
java·linux·开发语言
极小狐1 小时前
如何构建容器镜像并将其推送到极狐GitLab容器镜像库?
开发语言·数据库·机器学习·gitlab·ruby
多多*2 小时前
Java反射 八股版
java·开发语言·hive·python·sql·log4j·mybatis
正在走向自律2 小时前
从0到1:Python机器学习实战全攻略(8/10)
开发语言·python·机器学习
FY_20183 小时前
键盘输出希腊字符方法
开发语言
西西弗Sisyphus3 小时前
Python 处理图像并生成 JSONL 元数据文件 - 灵活text版本
开发语言·python
q567315233 小时前
Go语言多线程爬虫与代理IP反爬
开发语言·爬虫·tcp/ip·golang
Chandler243 小时前
Go语言即时通讯系统 开发日志day1
开发语言·后端·golang
强化学习与机器人控制仿真4 小时前
openpi 入门教程
开发语言·人工智能·python·深度学习·神经网络·机器人·自动驾驶