协程和Flow

### 协程

协程简单说就是一套线程切换的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等等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值