### 协程 协程简单说就是一套线程切换的API ,可以让我们写异步任务更加简单 不用像之前用handle 回到 。用同步的写代码的方式 写异步 让代码 更加好看 和清晰。 #### 协程的基础使用方式和基本原理。 协程最原始的Api createCoroutine 创建一个协程,然后再调用resume开启协程。startCoroutine创建并直接开启协程。 launch ,async 等这些框架API是在协程coroutine基础API上的再次封装,方便使用 ``` //第一步创建一个suspend 函数 val suspendFun : suspend () -> Unit = { //TODO 这里面写上协程要执行的代码,也被称之为协程体 } //第二步创建一个协程,并传一个协程执行完成后的回调 val continuation = suspendFun.createCoroutine(object :Continuation<Unit>{ override val context: CoroutineContext get() = EmptyCoroutineContext //协程执行完成后,会回调该方法,result代表了协程的结果,如果没有返回值就是Unit,如果协程体里面发生异常 //result里面包含有异常信息 override fun resumeWith(result: Result<Unit>) { println("协程执行完毕") } }) //第三步开启一个协程 continuation.resume(Unit) ``` 协程的启动要再协程作用域种。启动协程有3种方式 1. runBlocking (一般是用来测试的) 2. launch (使用最多的方式 完全异步) 3. async (会有等待) 参考CoroutineFlow类 CoroutineContext:协程上下文中包含的Element以及下上文的作用,传递。 CoroutineDispatcher:协程调度器的使用 CoroutineStart:协程启动模式在不同模式下的区别 CoroutineScope:协程作用域的分类,以及不同作用域下的异常处理。 挂起函数以及suspend关键字的作用,以及Continuation的挂起恢复流程。 CoroutineExceptionHandler:协程异常处理,结合supervisorScope和SupervisorJob的使用。 协程在Activity和Fragment种 使用lifecycleScope启动协程,在ViewModel中用 viewModelScope启动协程。 在其他环境中 我们可以采用通用的方式进行处理,其实还是根据协程作用域的差异分为两类: 1. 协同作用域:这一类我们就模仿MainScope自定义一个CoroutineScope。 2. 主从(监督)作用域:这一类我们直接使用MainScope,然后在此基础上做一些扩展即可。 ### Flow 响应式数据流 和rxjava功能类似,不过使用更加简单 配合协程和kotlin. 使用 1. flow{} 2. flowOf 3. asFlow 等创建 冷数据流 ,要在协程中使用. 4. StateFlow 5. SharedFlow 是热数据流 通过Channel实现 参考类CoroutineFlow #### 线程切换 切换线程使用flowOn扩展函数 1. flowOn可以将执行此流的上下文更改为指定的上下文。 2. flowOn可以进行组合使用。 3. flowOn只影响前面没有自己上下文的操作符。已经有上下文的操作符不受后面flowOn影响。 不管flowOn如何切换线程,collect始终是运行在调用它的协程调度器上。 Flow的操作符map,实际上collect也是一个操作符。只是他们的责任不一样。根据官方的说法,再结合自身使用感觉,笔者把Flow的操作符主要分为五种(非官方): 过度操作符:又或者叫做流程操作符,用来区分流程执行到某一个阶段。比如:onStart/onEach/onCompletion。过渡操作符应用于上游流,并返回下游流。这些操作符也是冷操作符,就像流一样。这类操作符本身不是挂起函数。它运行的速度很快,返回新的转换流的定义。 2. 异常操作符:用来捕获处理流的异常。比如:catch,onErrorCollect(已废弃,建议用catch)。 3. 转换操作符:主要做一些数据转换操作。比如:transform/map/filter/flatMapConcat等 4. 限制操作符:流触及相应限制的时候会将它的执行取消。比如:drop/take等 5. 末端操作符:是在流上用于启动流收集挂起函数。collect 是最基础的末端操作符,但是还有另外一些更方便使用的末端操作符。例如:toList、toSet、first、single、reduce、fold等等
08-15