• 协程和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等等
    
  • 相关阅读:
    电脑怎么录屏?如何开启录屏功能,试试这2个方法
    【JavaScript】鼠标、键盘的基础事件
    听懂未来:AI语音识别技术的进步与实战
    java毕业生设计宠物管理系统计算机源码+系统+mysql+调试部署+lw
    stable diffusion , parameters in Outpainting
    根据条件查询下载Excel表单(Java+Vue 及 Vue 两种方式)
    [附源码]java毕业设计教务系统
    JavaWeb之Servlet-----(2)
    数据结构_B树(C语言)
    成都瀚网科技有限公司抖音带货正规
  • 原文地址:https://blog.csdn.net/zhangxi1224/article/details/132714412