网站改版方案ppt,wordpress 后台进不去_如何替换主题,虚拟主机多网站,wordpress版块插件Kotlin协程#xff0c;好用#xff0c;但是上限挺高的#xff0c;我一直感觉自己就处于会用#xff0c;知其然不知其所以然的地步。
做点小总结#xff0c;比较浅显。后面自己再继续补充吧。
一、什么是协程#xff1f;
Kotlin 协程是一种轻量级的并发编程方式#x…Kotlin协程好用但是上限挺高的我一直感觉自己就处于会用知其然不知其所以然的地步。
做点小总结比较浅显。后面自己再继续补充吧。
一、什么是协程
Kotlin 协程是一种轻量级的并发编程方式用于简化异步代码的编写。它允许你编写看似同步的代码来处理异步任务使代码更加简洁、可读且易于维护。协程广泛应用于 Android 开发中用于网络请求、数据库操作等需要异步执行的任务。
协程是一种语法糖 协程的出现是来解决异步问题的但它本身却不提供异步的能力协程某种意义上更像是一种语法糖它为我们隐藏了异步调用和回调的细节让我们更关注于业务逻辑的实现。一句话概括协程是一种轻量级的方便操作异步代码的语法糖而它本身不提供异步能力。
二、Kotlin 协程的核心概念 协程 (Coroutine)一种轻量级的线程。协程可以在不阻塞主线程的情况下挂起和恢复使得代码能够异步执行而不增加线程开销。协程在 Kotlin 中由 suspend 函数来支持避免回调地狱的情况。 挂起函数 (suspend function)使用 suspend 关键字修饰的函数可以在协程中挂起。挂起函数不会阻塞线程而是挂起当前协程直到任务完成后再继续执行。例如
suspend fun fetchData(): String {// 模拟网络请求delay(1000) // 挂起 1 秒不会阻塞线程return Data fetched
}挂起 (Suspend) 和恢复 (Resume)当协程执行到 delay、withContext 等挂起函数时它会暂停执行并释放资源一旦挂起函数完成任务协程会恢复执行。这种机制使得协程能够在同一线程上无缝切换从而提高性能。 作用域 (CoroutineScope)协程作用域定义了协程的生命周期。常见的协程作用域有 GlobalScope、CoroutineScope、viewModelScope 和 lifecycleScope它们决定了协程的启动与取消。作用域有助于自动管理协程确保在不再需要协程时取消它避免资源泄漏。 上下文 (CoroutineContext)协程的上下文包含了协程的调度器比如 Dispatchers.Main、Dispatchers.IO和其他信息。上下文指定了协程在哪个线程或线程池上执行调度器为协程提供执行环境。
三、协程的特点 轻量 一个线程中可以包含多个协程协程支持挂起不会让正在运行协程的线程阻塞与阻塞线程相比挂起协程的操作更轻量内存泄漏更少 协程使用了结构化并发机制可以在一个作用域内执行多个操作可以一次性全部取消掉这样就不用像 RxJava 一样要自己把 Disposable 放在 CompositeDisposable 里内置取消支持 当我们取消一个协程时取消操作会在运行中的整个协程层次结构内传播也就是父协程取消后子协程也会被取消Jetpack支持 集成 Jetpack 中的 ViewModel 、Lifecycle 和 LiveData 都提供了对应的协程作用域Kotlin 协程框架中的挂起函数有另外一个好处就是可以在编译时就让方法的调用方知道这是一个耗时的操作需要确定这个操作要放在哪个线程执行这样就不用像 Android 框架对主线程网络请求的禁止方式一样在运行时才抛出异常。 四、协程和线程的区别
(1)协程是编译器级别的线程是系统级别的。协程的切换是由程序来控制的线程的切换是由操作系统来控制的。
(2)协程是协作式的线程是抢占式的。协程是由程序来控制什么时候进行切换的而线程是有操作系统来决定线程之间的切换的。
(3)一个线程可以包含多个协程。
(4)Java中多线程可以充分利用多核cpu协程是在一个线程中执行。
(5)协程适合io密集型的程序多线程适合计算密集型的程序(适用于多核cpu的情况)。当你的程序大部分是文件读写操作或者网络请求操作的时候这时你应该首选协程而不是多线程首先这些操作大部分不是利用cpu进行计算而是等待数据的读写其次因为协程执行效率较高子程序切换不是线程切换是由程序自身控制因此没有线程切换的开销和多线程比线程数量越多协程的性能优势就越明显。
(6)使用协程可以顺序调用异步代码避免回调地狱。
五、协程的使用
Kotlin 提供了丰富的协程构建器如 launch 和 async分别用于启动协程并发任务。
1. launch
launch 是一种最常用的协程构建器用于启动一个新协程并且不会阻塞主线程。它的返回值是 Job可以用于取消协程。
GlobalScope.launch {val result fetchData()println(result)
}2. async
async 用于并发执行多个任务适合需要返回结果的情况。它的返回值是 Deferred可以通过 await() 来获取执行结果。
CoroutineScope(Dispatchers.Main).launch {val result1 async { fetchData() }val result2 async { fetchData() }println(result1.await() result2.await())
}六、Job的使用
我们在使用launch的时候就启动了一个协程launch方法会返回一个job。
1.使用job.cancel()取消一个协程
fun main() {val job GlobalScope.launch {delay(1000L)println(World!)}job.cancel()println(Hello,)}
因为协程被取消了所以只会打印Hello。
2、join()等待协程执行完毕
作用类似于Thread.join()函数join()后面的代码会等到协程结束再执行结果如下
fun main() runBlocking {val job GlobalScope.launch {delay(1000L)println(World!)delay(1000L)}println(Hello,)job.join() println(Good)
}//依次打印
Hello,
World!
Good
七、 其他注意事项
在Activity或Fragment中使用协程时要尽量避免使用GlobalScope因为GlobalScope是生命周期是process级别的所以上面的例子中即使Activity或Fragment已经被销毁协程仍然在执行。
建议使用具有生命周期协程LifecycleScope。
关于kotlin相关的同步异步回调阻塞这篇文章很生动
https://juejin.cn/post/7373502637729513506https://juejin.cn/post/7373502637729513506retrofit搭配协程
https://juejin.cn/post/6962921891501703175https://juejin.cn/post/6962921891501703175emmm...感觉写的很浅还有很多知识点没有概括到后面补充