【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开发中得到了广泛应用,尤其是在需要处理复杂的异步操作时。

相关推荐
陈老师还在写代码1 分钟前
android studio 签名打包教程
android·ide·android studio
csj501 分钟前
android studio设置
android
hifhf4 分钟前
Android Studio gradle下载失败报错
android·ide·android studio
陈老师还在写代码5 分钟前
android studio,java 语言。新建了项目,在哪儿设置 app 的名字和 logo。
android·java·android studio
消失的旧时光-194315 分钟前
Kotlin reified泛型 和 Java 泛型 区别
java·kotlin·数据
郝学胜-神的一滴22 分钟前
深入解析C++命令模式:设计原理与实际应用
开发语言·c++·程序人生·软件工程·命令模式
ʚ希希ɞ ྀ42 分钟前
单词接龙----图论
开发语言·javascript·ecmascript
散峰而望44 分钟前
基本魔法语言数组 (一) (C语言)
c语言·开发语言·编辑器·github·visual studio code·visual studio
MATLAB代码顾问1 小时前
MATLAB实现模糊PID控制
开发语言·matlab
虾说羊1 小时前
ssm面试题梳理
java·开发语言·rpc