协程和Flow

### 协程

协程简单说就是一套线程切换的API ,可以让我们写异步任务更加简单 不用像之前用handle 回到 。用同步的写代码的方式
写异步
让代码 更加好看 和清晰。


#### 协程的基础使用方式和基本原理。

协程最原始的Api createCoroutine 创建一个协程,然后再调用resume开启协程。startCoroutine创建并直接开启协程。
launch ,async 等这些框架API是在协程coroutine基础API上的再次封装,方便使用

```

//第一步创建一个suspend 函数
val suspendFun : suspend () -> Unit = {

    //TODO 这里面写上协程要执行的代码,也被称之为协程体
}
//第二步创建一个协程,并传一个协程执行完成后的回调
val continuation =  suspendFun.createCoroutine(object :Continuation{
    override val context: CoroutineContext
        get() = EmptyCoroutineContext

   //协程执行完成后,会回调该方法,result代表了协程的结果,如果没有返回值就是Unit,如果协程体里面发生异常
   //result里面包含有异常信息
    override fun resumeWith(result: Result) {
        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等等

你可能感兴趣的:(Android)