朱涛 · Kotlin 编程第一课
朱涛
Google 认证的 Kotlin、Android 开发者专家,博客“Kotlin Jetpack 实战”作者
6717 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
朱涛 · Kotlin 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

21 | select:到底是在选择什么?

你好,我是朱涛。今天我们来学习 Kotlin 协程的 select。
select,在目前的 Kotlin 1.6 当中,仍然是一个实验性的特性(Experimental)。但是,考虑到 select 具有较强的实用性,我决定还是来给你介绍一下它。
select 可以说是软件架构当中非常重要的一个组件,在很多业务场景下,select 与 Deferred、Channel 结合以后,在大大提升程序的响应速度的同时,还可以提高程序的灵活性、扩展性。
今天这节课,我会从 select 的使用角度着手,带你理解 select 的核心使用场景,之后也会通过源码帮你进一步分析 select API 的底层规律。学完这节课以后,你完全可以将 select 应用到自己的工作当中去。
好,接下来,我们就一起来学习 select 吧!

select 就是选择“更快的结果”

由于 select 的工作机制比较抽象,我们先来假设一个场景,看看 select 适用于什么样的场景。
客户端,想要查询一个商品的详情。目前有两个服务:缓存服务,速度快但信息可能是旧的;网络服务,速度慢但信息一定是最新的。
对于这个场景,如果让我们来实现其中的逻辑的话,我们非常轻松地就能实现类似这样的代码逻辑:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kotlin协程的select是一个实验性特性,但在软件架构中具有重要作用。通过select,可以在多个挂起函数同时执行时,选择返回速度更快的结果,提高程序的响应速度和灵活性。文章通过比较传统的挂起函数串行执行和select并发执行的方式,展示了select的优势。通过示例代码,演示了如何使用select和async搭配实现并发执行和选择最快结果的功能,以及如何应对缓存服务出现问题的情况。同时,还展示了如何在多个缓存服务情况下,轻松扩展select的应用。总之,select不仅可以提升程序的整体响应速度,还可以提高程序的灵活性和扩展性。文章还介绍了select与Channel的搭配使用,以及如何处理Channel中的数据和异常情况。通过这些示例,读者可以快速了解select的用法和优势,以及如何在实际项目中应用select来提升程序性能和灵活性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 白乾涛
    作为一个 Android 开发同学,我感觉协程没 Kotlin 基础语法香。 因为在 Android 中,异步任务没那么多,也没什么嵌套,只要稍加封装,用起来也没那么痛。 所以协程没想象中的那么实用。

    作者回复: 你这么说也是有道理的,协程API有它的优势,但它的门槛太高了。

    2022-03-13
    3
    3
  • 抱紧我的小鲤鱼
    不是很理解select的应用场景

    作者回复: 其实就是:“多路复用”

    2022-04-27
    2
  • 白乾涛
    所有的 onXX 都是回调 所有的异步都会用到回调

    作者回复: 嗯,大概是这么个意思,但可以讲的更清楚一点哈。

    2022-03-09
    2
  • L先生
    是不是类似于callback,包了一层,返回出去。内部可能每个包个async,然后谁先出数据就callback出去

    作者回复: 很接近了。

    2022-03-07
    2
    1
  • jim
    配合Channel使用感觉变复杂了

    作者回复: select当然比单纯的Channel复杂,但需要级联多个Channel的场景下,其他手段一定会比select更复杂~

    2022-04-02
  • Paul Shan
    请问老师,是不是flow因为有了combine等操作符就不需要select了?

    作者回复: 一方面是因为有了combine操作符,另一方面也是因为Flow有多种实现“冷的Flow”,“热的SharedFlow”等等,一个select已经很难兼顾这些实现了。

    2022-03-24
  • better
    onXXX 表示回调的多,另外也可以表示会自动执行的方法(看个人习惯)。 感觉源代码难读,大概读了一下,发现有个注册回调的地方,当回调执行时,会判断一下 isSelected,如 select 已选择,则后续的就不走了。不知道对不对

    作者回复: 嗯,差不多是这个流程。

    2022-03-09
  • 神秘嘉Bin
    是不是利用了onComplete和onStart进行计时,然后返回最快的一个?

    作者回复: 思考的方向对了,其实本质上还是注册了回调。

    2022-03-07
  • Renext
    学习了

    作者回复: 加油~

    2022-03-07
  • 瞌睡的李先生
    学过go语言的同学会感觉到这一篇真的特别好理解。学到现在感觉kotlin的协程有种集百家之长的感觉,对于多种语言背景的同学都可以方便地学习上手。
    2022-09-12归属地:浙江
    2
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部