V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fyooo
V2EX  ›  程序员

有人用 kotlin 协程特性写 android 应用么?

  •  
  •   fyooo · 2020-04-22 09:52:43 +08:00 · 4393 次点击
    这是一个创建于 1436 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看了一下 《 kotlin 协程-Android 实战
    》( https://juejin.im/post/5d74ad56e51d456201486eab) ,感觉协程比 RxJava 简约很多。

    好像 kotlin 协程听得不多,是不是因为 android 版本 API 限制?
    32 条回复    2020-04-22 18:20:45 +08:00
    Lin0936
        1
    Lin0936  
       2020-04-22 09:58:13 +08:00   ❤️ 1
    kotlin 协程是靠编译实现的, Android API 版本没有限制.
    正在用 Kotlin + Jetpack 全套弄一个 APP, 坑也多, 不过写起来确实很爽
    fyooo
        2
    fyooo  
    OP
       2020-04-22 10:07:05 +08:00
    @Lin0936 已发送感谢,谢谢指点
    Tolcol
        3
    Tolcol  
       2020-04-22 10:08:19 +08:00
    写起来很爽,正在用,主要是觉得 RxJava 包太大了,用的地方也不是很多,可以节约 2M+的包大小
    gz911122
        4
    gz911122  
       2020-04-22 10:08:52 +08:00
    怎么听得不多..
    现在不都在用么?
    yumerdev93
        5
    yumerdev93  
       2020-04-22 10:10:37 +08:00
    以前刚接触 rxjava,惊叹「哇,还可以这样」,现在用了协程后觉得 rxjava 繁琐死了,不会再使用,现在项目依赖已经没有 rxjava 了。
    jinhan13789991
        6
    jinhan13789991  
       2020-04-22 10:13:54 +08:00
    已经在用了

    ```kotlin
    override fun onClickInsertImage() {
    MediaSelectService().openGallery(context, MediaType.图片, 9)
    .flatMapConcat { it.asFlow() }
    .flatMapConcat {
    FileUploadService()
    .uploadFile(UriUtils.uri2File(it).absolutePath, type)
    .onStart { showLoadingListener.invoke(true) }//上传第一张就显示 dialog
    }
    .onCompletion { showLoadingListener.invoke(false) }//上传结束隐藏 dialog
    .onEach { insertImage(it) }//插入图片
    .launchInAndHandleError(scope)
    }
    ```
    MediaSelectService()是对 PermissionsUtils 和 RxImagePicker 的封装,会申请对应的权限,然后打开页面返回图片地址列表。
    FileUploadService() 是对云存储的封装,会调用接口,拿到上传 token,再调用腾讯云的上传 sdk,最后拿到上传后的图片连接。
    最后是把图片插入到富文本里。
    launchInAndHandleError() 是对 kotlin 协程流的扩展方法,主要是全局统一处理错误异常。
    我只能说,太 TMD 好用了。
    jinhan13789991
        7
    jinhan13789991  
       2020-04-22 10:14:46 +08:00
    Markdown 失败~
    jeremaihloo
        8
    jeremaihloo  
       2020-04-22 10:15:37 +08:00
    现在应该都在用吧,我反正两个项目在用了
    wysnylc
        9
    wysnylc  
       2020-04-22 10:22:26 +08:00
    binbinyouliiii
        10
    binbinyouliiii  
       2020-04-22 10:26:57 +08:00 via Android
    我觉得协程的特性在这种客户端上没什么明显的优点
    youxiachai
        11
    youxiachai  
       2020-04-22 10:31:27 +08:00
    因为...协程用起来太简单了..没啥值得说的...
    你说协程的原理....的话..又不局限与 kotlin....
    jinhan13789991
        12
    jinhan13789991  
       2020-04-22 10:38:55 +08:00
    @binbinyouliiii 提升编程效率,简化代码结构。这还不算优点吗?
    gz911122
        13
    gz911122  
       2020-04-22 10:42:14 +08:00
    @wysnylc

    这个文章说的是错的,kotlin 的协程是真协程,作者感觉完全没认真看过 kotlin 协程的实现...
    whyrookie
        14
    whyrookie  
       2020-04-22 10:51:39 +08:00
    kotlin 协程+jetpack,很香的
    youxiachai
        15
    youxiachai  
       2020-04-22 10:56:29 +08:00
    @wysnylc 老实说,协程本质是一个状态机的规范......
    我很难理解有些人说什么假协程....
    讨论协程的性能的...就是实现上的区别.....
    问题是,协程本质是个状态机的问题....扯实现..就扯远了...跟谈不上对比...
    都是出自一个妈的论文...
    感觉就跟讨论粘包一样,都不对口...
    richard1122
        16
    richard1122  
       2020-04-22 10:58:44 +08:00
    小坑不少,但是挺好用的。特别是从比较上层就进入携程,工具什么的都可以提供 suspend method
    binbinyouliiii
        17
    binbinyouliiii  
       2020-04-22 12:28:20 +08:00 via Android
    @jinhan13789991 你编写效率再高,也不如符合直觉的传统编程啊
    rosu
        18
    rosu  
       2020-04-22 12:36:21 +08:00 via iPhone
    新项目可以考虑加入。迭代旧代码就算了。suspended method 要包住一个同步方法,不然不用协程就无法调用。
    nicevar
        19
    nicevar  
       2020-04-22 12:46:43 +08:00
    对写客户端来说,不太实用,个人觉得没有对编程效率没有任何提升,kotlin 的代码已经能做到很简洁了,很多时候还不如对上层进行一定的封装
    gz911122
        20
    gz911122  
       2020-04-22 13:08:40 +08:00
    @binbinyouliiii 协程不比回调或者 rx 更符合直觉么?
    binbinyouliiii
        21
    binbinyouliiii  
       2020-04-22 13:19:44 +08:00 via Android
    @gz911122 我说的就是异步编程在客户端上优点不明显
    gz911122
        22
    gz911122  
       2020-04-22 13:20:44 +08:00
    @binbinyouliiii 我说的就是客户端,你和服务端比,java 服务端主流是阻塞写法当然更符合直觉.

    但是客户端都是异步的,你觉得是协程的符合直觉还是 rx 符合直觉?
    zhouquanbest
        23
    zhouquanbest  
       2020-04-22 13:32:16 +08:00
    百度输入法好像再用吧 量挺大
    我们生产环境不敢上,毕竟很多人线程都没搞明白,我们 apm 监控体系都没支持它,万一写坑了还不好找。
    现在像 gradle 插件啊 不影响运行时的地方 我们都开始用了
    binbinyouliiii
        24
    binbinyouliiii  
       2020-04-22 13:34:34 +08:00
    @gz911122 #22 我不知道我们理解的是不是一样的,你说的都是异步是指操作类的异步吧,我说的异步是指充分利用 CPU 的这种异步,客户端按理说需要这种的场景比较少。
    gz911122
        25
    gz911122  
       2020-04-22 13:36:29 +08:00
    @binbinyouliiii
    我说的就是通常的异步啊.

    点击按钮,发起请求,显示结果.
    这不是一个典型的异步场景吗?
    说确切点,移动端上除了 ui 操作,都需要异步啊.

    没明白你说的什么意思,也没太懂为啥移动端上要充分利用 cpu,拿用户手机挖矿吗?
    gz911122
        26
    gz911122  
       2020-04-22 13:38:36 +08:00
    @binbinyouliiii 你给我造成的感觉是,你是做 java 后端的,对 android 开发并不熟悉. 你讲的仿佛是并发而不是移动端上通常所说的异步.
    WebKit
        27
    WebKit  
       2020-04-22 13:59:40 +08:00 via Android
    已经在用了。是很方便
    WanzizZ
        28
    WanzizZ  
       2020-04-22 14:06:30 +08:00
    哈哈 今晚和明晚扔物线有个课程专门讲 kotlin 协程的,两分钱,可以白嫖看看 https://ke.qq.com/course/2204707?tuin=9c77727#term_id=102307391
    hantsy
        29
    hantsy  
       2020-04-22 14:13:12 +08:00
    Google 官方都有视频 Kotlin 系列教程,包括 Kotlin coroutines 在 Android 上应用,(我虽然不做 Android )
    AliMaster
        30
    AliMaster  
       2020-04-22 14:28:34 +08:00
    kotlin 协程在安卓上是用线程池实现的一套线程池框架,不愿意翻源码可以看看扔物线朱凯的视频和文章 https://kaixue.io/tag/kotlin-coroutines/
    Vedar
        31
    Vedar  
       2020-04-22 14:39:07 +08:00
    koltin 的就是真正协程 和 python js 的一样,倒是 go 的不能叫协程 不是一个东西
    hlayk
        32
    hlayk  
       2020-04-22 18:20:45 +08:00
    多尝试 你会喜欢上的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2959 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:07 · PVG 23:07 · LAX 08:07 · JFK 11:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.