day30 Kotlin coroutine 结赛统整

有人说作为新手不好理解,我觉得蛮正常的,一来我中文其实不好,二来要理解新概念只用看的其实不够,最好是动手写code,将理解的概念自己用code呈现出来,这时概念就已经在脑中慢慢成形了; 另外我每篇必看的连结至少都看过3遍,也蛮建议搭配着看的

那对於我中文不好的部分,我会在未来有办法讲得更通顺时回来改我的文章,或是你们可以留言你认为如何诠释会更好

那要复习的其实很多,我这边先下限制器,每篇能用的中文字只有60字,我会在里面讲完重点,只有范例的天数会直接跳过

大大大复习

在ide里面,一个coroutine长这样

CoroutineScope(Job())

你可以透过launch或是async去开始一个coroutineScope,launch是一种fire and forget的方式,并且她会回传Job,async会回传deferred,你要记得去await()蒐集他

在android里面,还提供lifecycleScope和viewModelScope俩的跟着android生命周期的scope

当你在coroutine里面再建立coroutine

CoroutineScope(Job() + Dispatcher.IO).launch{
    launch (Dispatcher.default){
    
    }
    async{
    
    }
}

coroutineContext就会被继承,name、Dispatcher、ExceptionHandler是可以被继承或是替换的,范例中的Dispatcher就被替换成default

而传入的Job会被认定是新coroutine的parent,并且Job不会继承,而是系统分配实例,你也可以透过获得job去做细部处理,像是取消或等待

coroutine的父子关系很重要,因为它会深深影响exception和cancel,在这里,cancel其实是透过丢出一个cancelException来做取消,而coroutine会判断,如果是cancelException就不向上传递,而如果是其他的Exception会向上传递并取消sibling,直到root

但我们其实也有方法解决,透过SupervisorScope、supervisorJob(),或是ExceptionHandler可以防止全部的coroutine被一个exception取消任务

而coroutine本身也需要开发者对其做取消

val newScope = CoroutineScope(Job())
...
newScope.cancel()

经常和coroutine一起使用的有withContext和suspend,suspend透过编译,可以做出感觉像挂起的功能,而withContext则可以让你把block里的任务切换dispatcher,等任务结束再切回来

那除了one shot的请求,coroutine同样提供了资料流的方式flow

flow底下又有shareflow、stateflow、callbackflow,其实都有异曲同工之妙

从最基本的flow开始,他是一个冷数据流,分三个部分producer、intermediary、consumer,producer不在意最後的结果,他只负责提供资料,intermedairy不是必须,但你可以用它改变流的内容,consumer最重要,透过呼叫consumer你才能启动流

(0..5).asFlow()//producer
        .map{//intermediary
            it * 2
        }
        .collect {//consumer
            Timber.d(it.toString())
        }


callbackFlow其实就是提供一个简单的方法,让你把callback变成flow

 callbackFlow<Post> {
     callbackGetData{
         trysend()
     }
     callbackfail{
         close()
     }
 }

stateflow和shareflow都是热数据流,意即他们可以独立存在,同时他们也能一个流对多个consumer(在这里称为subscriber订阅者),stateflow能够真正意义上取代liveData,用法也非常相似,而他其实是继承自shareflow设计的,两者的最大的差异在於

  1. shareflow可以设置buffer而stateflow不行
  2. stateflow不会更新和旧值相同的新值
  3. stateflow只会最後保留一个值,可以透过value去取

coroutine还有一个东西叫channel,简单说他就是一个可以横跨coroutine的queue

而实际开发上,其实还有并发问题,android应该比较容易遇到按钮重复触发,最简单就是禁用按钮直到result回来

而在server或是应用上有特殊需求也可以用其他解法

  1. 以最新的为主
  2. 取消新请求
  3. 一个一个执行

类似的情境还有大量操作,这时volatile没用,result可以分成两类解法,共享数据和消息传递

共享数据就以atomic和mutex代表,而消息传递以actor代表,至於将任务限制到单线程执行也是可以,但我不确定要分到哪

以上30天的基本coroutine就讲完了:)

感言

那这系列为什麽要说是新手向呢?
我是希望给只会day2用法的新手看,让你们看完可以踏出新手後的第一步(这步有点多就是了),更重要的是当你概念清楚了,不论是debug、写测试、看别人的code,你可以很快进入状况

在聊一下我自己写完文章後的感想,其实没有到很深吧,我已经尽量跳过source code和底层实现了,当然这些也很重要,请各位自己去看,因为我不想讲哈哈哈哈哈

那这系列的文章,我觉得在深度上应该只涵盖3~5%,考虑到达克曲线还可能更低,你说是不是该叫新手向

那讲到测试,我在20天时其实就再考虑後面的进度怎麽排,flow後测试和并发应该只能选一个,好在今年不只我讲coroutine,所以这边我直接开门,测试看这里,他也是今年铁人赛写coroutine的开发者,也可以去看看他的文章,学习还是要多了解,因为每个人其实都会有理解盲点

10/29 更 看到不错的coroutine测试文章,kt academy test coroutine,应该会比上面的更多内容。

这个连结里面有kt academy蛮多关於coroutine的文章,连结
这个连结里面有android 官方coroutine文章,连结


<<:  DAY30:文章最後的总结

>>:  Day29:歪楼无极限(全英文笔记 - III)

自动化很潮,我们来建一套!

导入自动化,期望达到减少人力资源,降低成本,提高生产力等等。而软件工程的自动化已经开始转换成 Dev...

软件开发 五层次的用户体验

软件开发中,产品经理在规划产品方案时,都会注意用户体验的部分,其实关於用户体验的部分 James G...

Day03:资料结构 - 列表(List)

什麽是资料结构? 前一天有提到空间复杂度(Space Complexity),简单的复习一下,空间复...

Day 18 网页分析 - Web Application Analysis (Skipfish )

工具介绍 Skipfish是一个google开发的网页安全扫描工具,主要特色如下 纯C打造的高效工具...

Ruby on rails - 1

Mac OS 开发系统 完成基本环境设置後 开始新专案 在终端机 Terminal cd 到指定要放...