协程备忘录。。

300 阅读2分钟
协程Api备忘录哈哈哈哈哈
原文链接:https://juejin.cn/post/6860464281272451080
根据这篇文章 自己跟着调试一遍 防止忘记 自己手打了一份出来 增加印象

 * GlobalScope :单利对象 全局只有一个对象  作用域用于全局
 * MainScope : 主线程协程作用域
 *
 *
 *  创建"子协程"作用域:coroutineScope() 和 supervisorScope()
 *              tip:只能在一个已有的协程内调用
 *              ---coroutineScope :遇见异常会抛出 并且取消父协程和其他子协程
 *              ---supervisorScope  : 出现异常不会影响其他子协程
 *
 *
 *  创建协程:launch 和 async
 *          --- launch : 会返回一个「Job」 用于协程监督和取消 适用于无返回值的情况
 *          --- async : 会返回一个「Job」子类 「Deferred」 可以通过await 获取完成时的返回值
 *
 *  挂起:suspend : 这个关键字就是一个警告⚠️ 警告使用者 被修饰的方法将会是一个耗时的任务 被suspend修饰的方法 只能使用在协程 或 其他suspend 方法内
 *
 *
 *
 *
 * 「Job」的API
 *          协程状态
                isActive: Boolean    //是否存活
                isCancelled: Boolean //是否取消
                isCompleted: Boolean //是否完成
                children: Sequence<Job> // 所有子作业

            协程控制
                cancel()             // 取消协程
                join()               // 堵塞当前线程直到协程执行完毕
                cancelAndJoin()      // 两者结合,取消并等待协程完成
                cancelChildren()     // 取消所有子协程,可传入CancellationException作为取消原因
                attachChild(child: ChildJob) // 附加一个子协程到当前协程上Job」的生命周期:
        New  新建
        Active 激活
        Completing 完成中
        Completed   已完成
        Cancelling  取消中
        Cancelled   已取消

    「Job」的状态检查:
                    yield() 检查当前协程是否完成 如果完成 会抛出CancellationException
                    ensureActive() //如果当前job处于不活跃状态会抛异常
                    isActive //当前是否是活跃状态


    协程的异常处理:
                1try catch 捕获 (无法捕获launch 和 async作用域内的异常)
                2:CoroutineExceptionHandler 全局处理 只支持 launch
                        例子:
                        // Dispatchers.Main 是 context  CoroutineExceptionHandler 是异常处理
                        launch(Dispatchers.Main+CoroutineExceptionHandler{_,e->
                        //处理异常
                        Toast.makeText(this@MainActivity,"e",Toast.LENGTH_SHORT).show()
                        }) { throw NullPointerException() }


    协程的启动模式:
                1:DEFAULT = 创建后立即开始调度 调度前被取消 直接进入取消响应状态
                2LAZY = 懒加载  需要手动调用 start join await 才会开始调度  调度前被取消 会进入异常结束状态
                // 和Default类似,立即开始调度,在执行到一个挂起函数前不响应取消。
                // 涉及到cancle才有意义
                @ExperimentalCoroutinesApi
                3ATOMIC,

                // 直接在当前线程执行协程体,直到遇到第一个挂起函数,才会调度到
                // 指定调度器所在的线程上执行
                @ExperimentalCoroutinesApi
                4UNDISPATCHED;



    多协程间传递数据:Channel
 **/