掌握 Kotlin 协程:在 Android 和后端开发中实现轻量级并发 (掌握控制网瘾的新药包括)
Kotlin 协程是一种轻量级的并发机制,可帮助您在 Android 和后端开发中编写可扩展且高效的代码。与传统线程相比,协程可以更轻松地管理并发,并且可以避免许多常见的并发问题。
协程基础
协程本质上是轻量级的线程,但它们比传统线程更轻便且更省内存。协程还支持协作式多任务处理,这意味着它们可以在同一线程上并发执行,而无需显式上下文切换。
创建协程非常简单。您只需使用
suspend
关键字标记一个函数,该函数表示该函数可以被挂起。您可以使用
GlobalScope.launch
或
runBlocking
等函数启动协程。
fun main() = runBlocking {// 创建协程val job = GlobalScope.launch {// 在协程中执行代码}// 等待协程完成job.join()
}
在 Android 开发中使用协程
协程非常适合在 Android 开发中使用,因为它们可以简化异步任务的管理。例如,您可以使用协程执行网络请求、处理文件 I/O 或更新 UI。
为了在 Android 中使用协程,您需要添加以下依赖项到您的
app/build.gradle
文件中:
dependencies {// Kotlinx 协程implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4")
}
您还可以使用 Jetpack 库(如
ViewModelScope
和
LifecycleScope
)来进一步简化协程的使用。
在后端开发中使用协程
协程也可以用于后端开发,例如在 Web 应用程序和服务器端应用程序中。协程可以帮助您编写高性能、可扩展的代码,同时避免常见的并发问题,如死锁和竞争条件。
要使用协程进行后端开发,您可以使用 Kotlinx 协程的
kotlinx-coroutines-core
库。该库提供了各种功能,可帮助您管理并发,包括协程启动器、上下文和调度程序。
例如,您可以使用协程执行以下操作:
- 处理 HTTP 请求
- 管理数据库连接
- 并行执行任务
结论
Kotlin 协程是一种强大的工具,可帮助您在 Android 和后端开发中编写可扩展且高效的代码。通过使用协程,您可以避免常见的并发问题,并编写在同一线程上并发执行代码。
如果您正在寻找一种提高应用程序性能和可扩展性的方法,那么 Kotlin 协程是您的理想选择。
聊一聊线程池和Kotlin协程
目前很多开发组都用上协程来处理异步任务了,但是有的地方协程提供的原生API还是不足以应付,比方说一些SDK提供了传入Executor的接口(以便复用调用者的线程池来执行异步任务),这时候可以用这JDK提供的线程池,或者封装一下协程也可以满足需求。
协程提供了 和 分别用于 计算密集型任务和 IO密集型任务,类似于RxJava的 ()和 () 。 但两者有所差异,比如RxJava的 ()不做并发限制,而 ()做了并发限制:
考虑到当前移动设备的CPU核心数都不超过64,所以可以认为协程的 的最大并发为64。 的并发限制为:
考虑到目前Android设备核心数都在2个以上,所以可以认为 的最大并发为 CPU cores。 和 是共享协程自己的线程池的,二者可以复用线程。 不过目前这两个Dispatchers 并未完全满足项目中的需求,有时我们需要一些自定义的并发限制,其中最常见的是串行。
RxJava有 (),但这个 () 和AsyncTask的 SERAIL_EXECOTOR 一样,是全局串行,不同的任务处在同一个串行队列,会相互堵塞,因而可能会引发问题。
或许也是因为这个原因,kotlin协程没有定义“。 对于需要串行的场景,可以这样实现:
这样可以实现局部的串行,但和协程的线程池是相互独立的,不能复用线程。 线程池的好处:
然彼此独立创建线程池的话,会大打折扣。 如何既复用协程的线程池,又自主控制并发呢? 一个办法就是套队列来控制并发,然后还是任务还是执行在线程池之上。 AsyncTask 就是这样实现的:
用SerialExecutor的execute的任务会先进入队列,当mActive为空时从队列获取任务赋值给mActive然后通过线程池 THREAD_POOL_EXECUTOR 执行。 当然AsyncTask 的SerialExecutor是全局唯一的,所以会有上面提到的各种任务相互堵塞的问题。可以通过创建不同是的SerialExecutor实例来达到各业务各自串行。
在Kotlin环境下,我们可以利用协程和Channel来实现:
添加Log编写测试如下:
执行结果:
第一个任务可以顺利通过send(), 而随后的任务被suspend, 直到前面的任务执行完(执行block),调用recevie(), 然后下一个任务通过send() ……依此类推。 最终,消耗4s完成任务。
如果Channel的参数改成2,则能有两个任务可以通过send() :
最终,消耗2s完成任务。
关于参数可以参考Channel的构造函数:
在前面的实现中, 我们关注UNLIMITED, BUFFERED 以及 capacity > 0 的情况即可:
不过, []本身有并发限制(目前版本是64), 所有对于 和 capacity > 64 的情况,和capacity=64的情况是相同的。 我们可以为不同的业务创建不同的Channel实例,从而各自控制并发且最终在协程的线程池上执行任务。 简要示意图如下:
为了简化,我们假设Dispatchers的并发限制为4。
通过Channel可以实现并发的控制,但是日常开发中有的地方并不是简单地执行个任务,而是需要一个ExecutorService或者Executor。 我们可以通过Channel封装一下:
需要简单地控制并发的地方,直接定义Channel然后调用runBlock即可; 需要Executor的地方,可创建ChannelExecutor来执行。
2023年新篇章,《Android开发进阶指北》完整版PDF开源!
给入门开发者的一份资料,Android八大模块,帮你掌握移动...
若对本页面资源感兴趣,请点击下方或右方图片,注册登录后
搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源
如有其他疑问,请咨询右下角【在线客服】,谢谢支持!
相关文章
- 揭秘图片编辑的奥秘:创造令人惊艳的视觉效果 (揭秘图片编辑软件)
- 适用于初学者和高级用户的图片编辑技巧和策略 (适用于初学者掌握的握拍方式为)
- 变身图片编辑专家:从初学者到大师的全面教程 (变身图片编辑软件)
- 终极图片编辑指南:让您的照片焕发光彩 (终极图片编辑软件)
- 用免费名片模板留住客户:设计让人难以忘怀的名片 (用免费名片模板的软件)
- 免费名片制作:创建体现您品牌价值的独特设计 (免费名片制作模板)
- 使用免费名片模板:为您的下一个活动或会议做好准备 (使用免费名片的好处)
- 免费名片设计:让您的业务信息脱颖而出的必备工具 (免费名片设计制作)
- 提升您的推销技巧:免费名片模板让您留下难忘印象 (提升您的推销能力)
- 为您的企业打造专业名片:免费模板提供无限可能性 (为您的企业打招呼英文)
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~