关键词:Kotlin 协程 异常处理 异步代码的异常处理通常都比较让人头疼,而协程则再一次展现了它的威力。 1....它更适合一系列对等的协程并发的完成一项工作,任何一个子协程异常退出,那么整体都将退出,简单来说就是”一损俱损“。这也是协程内部再启动子协程的默认作用域。...来捕获这个异常的,这再一次表明协程把异步的异常处理到同步代码逻辑当中。 那么如果我们把 coroutineScope 换成 supervisorScope,其他不变,运行结果会是怎样呢?...,1-8 的输出其实没有本质区别,顺序上的差异是线程调度的前后造成的,并不会影响协程的语义。...join 和 await 的不同:join 只关心协程是否执行完,await 则关心运行的结果,因此 join 在协程出现异常时也不会抛出该异常,而 await 则会;考虑到作用域的问题,如果协程抛异常
CoroutineScope 用起来没什么不一样的地方,通过同一个叫 mainScope 的实例启动的协程,都会遵循它的作用域定义,那么 MainScope 的定义时怎样的呢?...这里需要小心的是如果使用了一些没有依赖作用域的构造器,那么一定要小心。...,我们的协程就会收到 cancel 的指令,尽管这种情况下协程的执行不会跟随 Activity 的 onDestroy 而取消,但它与 View 的点击事件紧密结合,即便 Activity 没有被销毁,...上,结果返回时协程会帮我们切回到主线程——这非常类似 Nodejs 这样的单线程的工作模式。...一旦我们把协程的作用域规则以及协程与 UI 生命周期的关系熟稔于心,那么相信大家使用协程时一定会得心应手的。
它可以将协程限制在一个特定的线程执行,也可以把协程分配到一个线程池,或者让协程不受限制约束的进行运行。 协程上下文对象:CoroutineContext。...因此它与这个启动的作用域无关且独立运作。...但是子协程仍然处于活动状态,那么整个协程就仍然属于活动状态。 当然,我们如果主动调用.cancel() 那么子协程还没有运行完也会被强制结束了。 这就是协程中的父子协程之间的关系了。...初始协程时,多元素添加 我们学过载协程中初始化调度器,在上一步也学习了添加协程名称。 那么我们如果在启动的时候这两个配置属性都要进行添加,那么该如何处理? 可以通过+进行拼接。...Android 现在在所有具有生命周期的实体中(activity,Fragment等),都对协程作用域提供了一级支持。 局部数据传递 我们如果使用协程,特别是子协程,父协程混杂等等情况。
,那么问题来了,这里并没有告诉它父协程究竟是谁,因此也就谈不上作用域的事儿了,这好像我们用 GlobalScope.launch 启动了一个协程一样。...4.2 如何正确的将回调转换为协程 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建协程呢?...如果 cancel 抛异常而没有捕获的话,那么等同于协程体内部抛出异常,具体如何传播看所在作用域的相关定义了。...最后我们还分析了一下 Retrofit 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。...再稍微提一句,协程不是一个简单的东西,毕竟它的原理涉及到对操作系统调度、程序运行机制这样程序界毕竟原始的话题,但你说如果我对前面提到的这些都不是很熟悉或者根本没有接触过,是不是就要跟协程拜拜了呢,其实也不是
协程本质上是轻量级线程。 协程的特点有: 协程可以让异步代码同步化,其本质是轻量级线程。 可在单个线程运行多个协程,其支持挂起,不会使运行协程的线程阻塞。 可以降低异步程序的设计复杂度。...Kotlin协程实现层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持; 业务框架层:协程的上层框架支持,基于标准库实现的封装,也是我们日常开发使用的协程扩展库。...启动协程需要作用域,但是作用域又是在协程创建过程中产生的。 图片 官方提供的常用作用域: runBlocking: 顶层函数,可启动协程,但会阻塞当前线程 GlobalScope 全局协程作用域。...5.2 suspend本质 Kotlin 使用堆栈帧来管理要运行哪个函数以及所有局部变量。 协程在常规函数基础上添加了suspend和resume两项操作用于处理长时间运行的任务。...下面一起回顾一下全文重点内容,对全文内容进行一个总结 协程引入: 协程可以让异步代码同步化,降低程序涉及的复杂度 协程本质是轻量级线程,单个线程可以运行多个协程,协程的运行不会导致线程阻塞 协程启动:
协程通过在常规函数之上增加 suspend 和 resume 两个操作来解决上述问题。当某个特定的线程上的所有协程被 suspend 后,该线程便可腾出资源去处理其他任务。...在 launch 函数体内,您可以调用 suspend 函数并能够像我们上一篇介绍的那样保证主线程安全。 Launch 是将代码从常规函数送往协程世界的桥梁。...也就是说,如果某个协程启动了另一个新的协程,它们都会在同一个 scope 中终止运行。...这段代码中,我们在 coroutineScope 构造器中使用 launch 启动了一千个协程,您可以看到这一切是如何联系到一起的。...实现这种结构化并发,会为我们的代码提供一些保障: 作用域取消时,它内部所有的协程也会被取消; suspend 函数返回时,意味着它的所有任务都已完成; 协程报错时,它所在的作用域或调用方会收到报错通知。
二.协程和线程的联系和区别 联系:协程和线程都可以实现并发性,允许程序在同一时间处理多个任务;协程和线程都可以用于异步编程。 区别:协程是一种轻量级的线程,运行在线程之上。...而协程的挂起是不会阻塞线程的,运行在这个线程上的其他协程还会照常执行,并且协程挂起时会主动释放自己的CPU资源。...三.Kotlin协程的基础设施 Kotlin的协程实现分为两个层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持 业务框架层:协程的上层框架支持,也就是在基础设施层的基础上再封装一层...,在协程体内我们可以直接使用作用域内提供的函数或者状态等。 ...那么我们最关心的问题来了,协程如何处理线程的调度?
前言 Kotlin协程是什么,如何使用?如何结合Retrofit使用?Kotlin协程的优势在哪里?相信看完这一篇你一定有所收获!...,如果请求很多的话,第一 代码结构会很难看,第二 写着写着就很乱了,那么协程就可以很好的解决这个问题,下面我们来看使用协程的方式 怎么写....首先,对于一个耗时的操作,我们需要将他切换到后台线程执行,withContext函数可以构建一个协程作用域,他必须在挂起函数或者协程中执行,suspend关键字是kotlin为我们提供的 用于标记挂起函数的关键字...上面代码看起来没有什么问题,如果我们用到了mvp模式什么的,便于职责单一,还要单独放一个类中,这样就需要添加回调才能获取返回结果。 那么协程中怎么使用呢?...创建的协程在协程作用域的代码没有执行完毕前会一直阻塞线程,所以上面。
Kotlin/JVM 的协程既能完成异步请求,也能完成并行计算,并且由于协程中拥有挂起(suspend),Kotlin/JVM 就可以在协程而非线程的层面上来解决并发竞争的问题。...即当并发竞争出现的时候,这套机制只需将协程挂起而无需阻塞线程,而对于是否发生竞争的判断可以转移到原子操作上。...所以我预先猜测的是,如果没有发生事实上的多线程竞争,程序会正常运行,但是一旦发生多线程竞争,程序会抛出异常并崩溃。...但是当前预览版本的多线程协程中仍然没有线程池的实现,因此我们必须手动创建其他的多线程上下文。...从长远来看,协程-挂起机制是 Kotlin 的核心,如果后续 kotlinx.io库完整实现了基于 suspend 的 I/O,那么协程就可以一统Kotlin 上的所有异步并发场景,因此,Worker-
上下文与调度器: 理解协程上下文的概念,包括调度器(Dispatcher)的作用,如何在不同的线程上执行协程代码。 挂起函数: 掌握挂起函数的概念,以及如何在协程中调用和编写挂起函数。...协程作用域: 理解协程作用域的概念,如何管理多个协程的生命周期和范围。 并发与顺序性: 学会使用协程来处理并发任务和顺序性操作,以及如何组合多个协程的执行流程。...Kotlin Coroutine引入了协程作用域的概念,帮助我们更好地管理多个协程的执行以及确保资源的正确释放。 什么是协程作用域?...创建协程作用域 在Kotlin中,我们可以使用CoroutineScope来创建协程作用域。...通过使用launch函数,我们可以在不同的协程中同时执行多个任务,而这些协程可以在相同的作用域内运行,继承相同的上下文和调度器。
协程的async异步 和协程的 launch是相似的,只是它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。...大写的CoroutineScope与小写的coroutineScope的区别:小写的coroutineScope叫做协程构建器,里面自带继承父协程的上下文作用域,而大写的作用域是自定义设置的协程上下文作用域...6、Flow流:是冷流,就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。...既然都是共享内存那和我们自己使用共享内存有什么区别呢?所以更为准确的说法是为什么我们使用发送消息的方式来同步信息,而不是多个线程或者协程直接共享内存?...1.首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们在程序设计上提供更好的封装,让程序的逻辑更加清晰; 2.其次,消息发送在解耦方面与共享内存相比也有一定优势
那么,在 Android 中应该如何正确使用协程呢?再细分一点,如何直接在 Activity 中使用呢?如何配合 ViewModel 、LiveData 、LifeCycle 等使用呢?...协程在 Android 上的使用 GlobalScope 在一般的应用场景下,我们都希望可以异步进行耗时任务,比如网络请求,数据处理等等。当我们离开当前页面的时候,也希望可以取消正在进行的异步任务。...大致意思是,Global scope 通常用于启动顶级协程,这些协程在整个应用程序生命周期内运行,不会被过早地被取消。程序代码通常应该使用自定义的协程作用域。...MainScope 官方文档中提到要使用自定义的协程作用域,当然,Kotlin 已经给我们提供了合适的协程作用域 MainScope 。...那么如何在 ViewModel 中定义协程作用域呢?还记得上面 MainScope() 的定义吗?没错,搬过来直接使用就可以了。
如果将上述概念带入到协程与线程中,当一个线程执行时,它会一直运行,直到被操作系统强制中断或者自己放弃CPU;而协程的协作式则需要协程之间互相配合协作,以便让其他协程也可以获得执行机会,通常情况下,这种协作关系是由应用层...那Kotlin协程呢? 在上面,我们说了 线程 与 协程 ,但这个协程指的是 广义协程 这个概念,而不是 Kotlin协程 ,那如果回到 Kotlin协程 呢?...相应的,Kotlin协程 具有以下特点: 轻量:您可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。...对于挂起函数而言,在协程,是否真的被挂起,通过函数返回值来确定,但相应的,如果我们有挂起函数需要具备返回类型呢?那如果该函数没有挂起呢?...yield()时,该方法就会判断当前协程作用域是否已经不在活跃,如果满足条件,则直接抛出 CancellationException 异常。
今天我们继续来聊聊Kotlin的协程Coroutine。 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine?...协程的suspend有什么作用,工作原理是怎样的?...isDispatchNeeded进行判断当前协程的运行是否需要切换线程。...当然,如果你是在Android中使用协程,那基本上是不需要自定义线程的切换逻辑。因为kotlin已经为我们提供了日常所需的Dispatchers。...本篇文章主要介绍了ContinuationInterceptor作用与如何拦截协程的,同时也分析了CoroutineDispatcher内部结构,进一步剖析了协程线程切换的原理。
除此之外,当其中一个线程没有任务时,kotlin线程池则会尝试分发其他线程的任务给空闲线程。至于这么做有什么好处,官方给的答案是以最有效的方式在工作线程上分发已调度的任务。...协程的组成部分 kotlin协程框架主要由三部分组成:CoroutineScope(协程作用域)、CoroutineContext(协程上下文)、挂起函数。下面我们分别来介绍。...CoroutineScope(协程作用域) 前面简单介绍过,CoroutineScope 是协程的作用域,主要作用是用来追踪协程,方便我们批量地控制协程。...CoroutineScope 可以分成两种: GlobalScope,是指全局协程作用域,通过它创建的协程可以一直运行直到应用停止运行。...Job 结束运行 deferred.await() //阻塞等待直到获取协程的执行结果 前面我们提到过,kotlin 协程的一大特点就是结构化并发。
Kotlin的一个协程可以理解为是运行在线程上的一个执行任务并且该任务可以在不同的线程间切换,一个线程可以同时运行多个协程。...GlobalScope的协程调度器是Dispatchers.Default,那么我们如何改变呢?...()) } 那如果我们想在协程运行中改变线程怎么办?...最常见的,网络请求在IO线程,而页面更新在主线程。 Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。...那么Job是什么呢? 协程启动以后,我们可以得到一个Job对象,通过Job对象我们可以检测协程的生命周期状态,并且可以操作协程(比如取消协程)。 我们可以大致把Job理解为协程本身。
所以想让应用运行上不 “卡”、做到动画能够流畅运行或者能够快速响应用户点击事件,就得让那些耗时的任务不阻塞主线程的运行。 要做到处理网络请求不会阻塞主线程,一个常用的做法就是使用回调。...这些会导致执行时间长从而让用户感觉很 “卡” 的操作都不应该放在主线程上执行。 使用 suspend 并不意味着告诉 Kotlin 要在后台线程上执行一个函数,这里要强调的是,协程会在主线程上运行。...如果需要处理一个函数,且这个函数在主线程上执行太耗时,但是又要保证这个函数是主线程安全的,那么您可以让 Kotlin 协程在 Default 或 IO 调度器上执行工作。...在 Kotlin 中,所有协程都必须在调度器中运行,即使它们是在主线程上运行也是如此。协程可以自行暂停,而调度器负责将其恢复。...如果您在写代码的过程中也遵循这一点,那么您的代码将会变得非常简单,并且不会将线程问题与应用逻辑混杂在一起。
今天我们来聊聊Kotlin的协程Coroutine。 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine?...如果你已经接触过协程,相信你都有过以下几个疑问: 协程到底是个什么东西? 协程的suspend有什么作用,工作原理是怎样的?...解释了这么多,最后我们还是直接点,来看下它的优点 轻量:您可以在单个线程上运行多个协程,因为协程支持挂起,不会使正在运行协程的线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。...内存泄露更少:使用结构化并发机制在一个作用域内执行多个操作。 内置取消支持:取消功能会自动通过正在运行的协程层次结构传播。 Jetpack集成:许多 Jetpack 库都包含提供全面协程支持的扩展。...有了这个基础,我们再看它的get方法就很清晰了。先从element中去取,没有再从之前的left中取。 那么这个Key到底是什么呢?
前言 ViewModel和LiveData最早是Google提出的AAC架构中的重要成员,那么它为什么又和协程扯上关系了呢?...如果你没有怎么接触Flow,那么看完这篇文章,你可能也会对LiveData鸣不平,确实,Flow提供了类似RxJava强大的异步数据流处理能力,注意,这里说的是「异步数据流」,什么是异步数据流?...除此之外,为了利用协程的结构化并发,ViewModel提供了viewModelScope来作为默认的可控生命周期的协程作用域,所以,我们通常会抽象出一个ViewModel基类,封装viewModelScope...,这就是LiveData的协程作用域,当LiveData被注册的时候,作用域中的代码就会被执行,而当LiveData不再被使用时,里面的操作就会因为结构化并发而取消。...ViewBinding,ViewModel,LiveData,协程,异常捕获,生命周期控制有机的融合到了一起,作为一个OneShot的UI界面,我们在极简代码的基础上,实现了良好的分层架构。
Kotlin 协程作用 让线程主动释放CPU是协程一个作用,一个协程执行后挂起,然后让另一个协程执行, 等到这个协程执行完毕再让前一个协程继续执行。...协程可以不依赖于线程直接运行在进程中; 协程通过提升CPU的利用率,进而减少线程切换,进而提升程序运行效率; 协程启动与停止都是由代码操作,而不是操作系统调度; Kotlin 协程练习 Kotlin 练习参考...它启动了一个新的协程作用域并且在所有子协程执行结束后并没有执行完毕。 ...,协程上下文包括一个调度器,它确定相应的协程在执行时使用一个或多个线程,协程调度器会让协程执行在指定的局部线程中,调用它 //运行在线程池中或者不受它限制运行 fun testDispatcher...,那么它所有的子协程也会取消,使用GlobalScope来启动一个协程,它与作用域无关且独立启动 /** * 输出 * job1: I run in GlobalScope
领取专属 10元无门槛券
手把手带您无忧上云