第一个协程 在使用协程之前,需要保证Kotlin-Gradle-Plugin的版本高于1.3。目前最高的版本为1.3.11。...并且这样执行的协程,并不会阻塞主线程的执行 delay函数只能在协程中使用,否则编译不过,尽量避免使用GlobalScope.launch创建协程,当我们使用 GlobalScope.launch 时...而如果想要在当前线程创建协程的话,则需要使用runBlocking runBlocking { launch { Log.e(TAG,"${Thread.currentThread...但是这个函数必须使用suspend标识,否则编译错误,并且无法调用协程中到函数,比如delay()。...使用suspend标示的函数只能用于协程中,无法在其他函数中被调用 import kotlinx.coroutines.* fun main() = runBlocking { launch
阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。...这里给出结果,改用GlobalScope.launch之后,子协程会在一个独立的线程里运行。 runBlocking 在kotlin协程官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...没有的话就使用默认的eventloop。EventLoop是协程里对阻塞型coroutine进行调度的默认调度器。runBlocking和launch的主要区别就靠EventLoop实现。...在创建完coroutine后就进入派发流程了,这部分和Kotlin协程-一个协程的生命周期中的逻辑比较相似,下面也会讲到。...这个问说明,runBLocking{}这种协程,它的运行逻辑是先把父协程放队列里,然后取出来执行,执行完毕再把子协程入队,再出队子协程,用同样的方式递归。
文章目录 一、协程是什么 1.简介 2.协程好在哪 3.协程具体怎么用 a.添加依赖 b.开始使用 c.suspend 4.小结 二、挂起是什么 1....1.简介 协程并不是 Kotlin 提出来的新概念,其他的一些编程语言,例如:Go、Python 等都可以在语言层面上实现协程,甚至是 Java,也可以通过使用扩展库来间接地支持协程。...不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。...c.suspend suspend是 Kotlin 协程最核心的关键字,几乎所有介绍 Kotlin 协程的文章和演讲都会提到它。它的中文意思是「暂停」或者「可挂起」。...4,Kotlin 协程 的实战 5,漫画:什么是协程? 向大佬们致敬。
文章目录 一、Kotlin 协程分层架构 二、使用 Kotlin 协程基础设施层标准库 Api 实现协程 一、Kotlin 协程分层架构 ---- Kotlin 协程分层架构 : 在 Kotlin 中..., 协程分为两层 ; 基础设施层 : Kotlin 提供了 协程 标准库 Api , 为协程提供 概念 , 语义 支持 , 是 协程 实现的基础 ; Kotlin 协程的底层支持 ; 基础 Api ;...业务框架层 : Kotlin 协程的 上层框架 , 使用方便 ; 在之前博客中使用的 GlobalScope 类 , launch 函数 , delay 挂起函数 等都属于 业务框架层 , 都是 Kotlin...协程 的上层实现 ; 在 基础 Api 的基础上 进行了一层封装 , 形成了方便开发者使用的框架 ; 基础设施层 : 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.*...Kotlin 协程基础设施层标准库 Api 实现协程 ---- 协程 需要使用 协程体定义 , 协程体格式如下 : suspend { // 协程体内容 } 协程体定义完之后 , 调用协程体的 createCoroutine
image.png withContext kotlin 中 GlobalScope 类提供了几个创建协程的构造函数: launch: 创建协程 async : 创建带返回值的协程,返回的是 Deferred...类 withContext:不创建新的协程,指定协程上运行代码块 runBlocking:不是 GlobalScope 的 API,可以独立使用,区别是 runBlocking 里面的 delay 会阻塞线程
《Kotlin协程》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin的协程。聊协程之前先说一下具体聊的是协程的什么内容。 · 协程是什么? · 什么时候用协程?...· 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...协程到目前为止都还没进入kotlin的标准库,它是一个独立的依赖库,叫 Kotlinx。对于想在开发中使用协程的人来说,需要在依赖里加入kotlinx-core依赖。...在Kotlin里使用协程非常方便, import kotlinx.coroutines.* fun main() { GlobalScope.launch { // 在后台启动一个新的协程并继续...这个问题涉及到Kotlin协程的Scope,调度,也是协程的实现核心逻辑 Kotlin不是第一个提出协程的 实际上在Kotlin之前就有不少语言实践了协程这个概念。比如python,golang。
协程间的通信 协程与协程间不能直接通过变量来访问数据,会导致数据原子性的问题,所以协程提供了一套Channel机制来在协程间传递数据。...目前,在1.3.11版本的Kotlin中,produce与consume都还只是实验性的功能,没有正式release,使用时记得使用@ExperimentalCoroutinesApi标记使用的函数 runBlocking...它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。...协程与线程一样,对于数据的操作无法保持原子性,所以在协程中,需要使用原子性的数据结构,例如AotimicInteger等,或者使用mutex.withLock,来处理数据的原子性 import kotlinx.coroutines...、被限制并封装到该协程中的状态以及一个与其它协程通信的 通道 组合而成的一个实体。
关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...再谈 Retrofit 的协程扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin 协程 - 入门篇(https://www.bennyhuo.com/2019...deferred = CompletableDeferred() // ① ... } 这个 CompletableDeferred 本身就是一个 Job 的实现,它的构造可接受一个 Job 实例作为它的父协程...Continuation 实例,这实际上就相当于要继承当前协程的上下文,因此我们只需要在真正需要切换协程的时候再去做这个转换即可: public suspend fun Call<...) ,大家也可以直接添加依赖进行使用: compile 'ru.gildor.coroutines:kotlin-coroutines-retrofit:1.1.0' 这个框架代码量很少,但经过各路 Kotlin
本文将为大家详细介绍协程的几种启动模式之间的不同,当然,我不打算现在就开始深入源码剖析原理,大家只需要记住这些规则就能很好的使用协程了。 1....我们今天主要说 Kotlin。...在 Kotlin 协程当中,启动模式是一个枚举: public enum class CoroutineStart { DEFAULT, LAZY, @ExperimentalCoroutinesApi...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...就是需要它的运行结果的时候, launch 调用后会返回一个 Job 实例,对于这种情况,我们可以: 调用 Job.start,主动触发协程的调度执行 调用 Job.join,隐式的触发协程的调度执行
实现这个能力的关键在于协程实现了continuation接口。...从协程源码里猜测,它肯定是一个实现了continuation的类,因此它才能有可重入性。...把编译后的字节码用jd-gui打开可以看到,我们所写的协程会给编译器插入代码,实现SuspendLambda接类, ?...但这个函数又再次是 kotlin 标准库里的。...所以会看到虽然协程的外部概念很清晰,只是一个 coroutine,但在协程内部,实际上支撑它的还有Continuation,Dispatch,Intercept。还是挺复杂的。
搞清楚内部概念对分析协程源码来说非常关键。 协程的最小粒度-Coroutine 对没接触过协程的人来说,一个OOP代码的最小调度粒度是函数。...在协程中,最小的调度粒度是协程,在kotlin中叫coroutine。...为什么可以提升效率,在Kotlin协程-协程设计的基础中有具体解释。...协程框架三大件,Continuation-Disptacher-Scheduler Kotlin的协程从框架设计上就考虑了跨平台的问题。 这里的跨平台不是指安卓和服务端。...俗话说“javascript抢别人的活”,现在看kotlin连js的活也想抢。不知道过个十年kotlin和js有哪个还能被开发者使用。
关键词:Kotlin 异步编程 协程 上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 ? 1....这里又有大家没见过的内容啦, suspendCoroutine 这个方法并不是帮我们启动协程的,它运行在协程当中并且帮我们获取到当前协程的 Continuation 实例,也就是拿到回调,方便后面我们调用它的...对比前面的 RxJava 的做法,你会发现这段代码其实很容易理解,你甚至会发现协程的使用场景与 RxJava 竟是如此的相似。...Kotlin 协程设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?...如果大家在协程代码中使用锁之类的并发工具就反而增加了代码的复杂度,对此我的建议是大家在编写协程代码时尽量避免对外部作用域的可变变量进行引用,尽量使用参数传递而非对全局变量进行引用。
关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...sleep 让线程进入休眠状态,直到指定时间之后某种信号或者条件到达,线程就尝试恢复执行,而 delay 会让协程挂起,这个过程并不会阻塞 CPU,甚至可以说从硬件使用效率上来讲是“什么都不耽误”,从这个意义上讲...,为了做到这一点,我们用 Java 来仿写一下这段逻辑: 注意,下面的代码逻辑上并不能做到十分严谨,不应该出现在生产当中,仅供学习理解协程使用。...就是 Kotlin 协程编译之后产生的字节码。...小结 不同以往,我们从这一篇开始毫无保留的为大家尝试揭示协程背后的逻辑,也许一时间可能有些难懂,不过不要紧,你可以使用协程一段时间之后再来阅读这些内容,相信一定会豁然开朗的。
在进行业务开发时,我们通常会基于官方的协程框架(kotlinx.coroutines)来运用Kotlin协程优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...所以,为了我们在后续的学习中游刃有余,在使用官方给出的复合协程时能够胸有成竹,我们暂且抛开它,按照它的思路实现一个轻量版的协程框架。...} val result=deferred.await() println(result)//将会打印"使用async启动协程" } 4.协程的调度 截至目前,我们已经大致用程序勾勒出一个比较完善的复合协程了...协程需要调度的位置就是挂起点的位置,当协程执行到挂起点的位置时,如果产生了异步行为,协程就会在这个挂起点挂起,只有协程在挂起点正真挂起时,我们才有机会实现调度,而实现调度器需要使用协程的拦截器。...IO 调度器使用一个专门的线程池,允许执行大量的 IO 操作而不阻塞线程 无限制调度器(Dispatchers.Unconfined):允许协程在调用挂起函数的线程中继续执行,直到第一个挂起点。
【翻译】深入 Kotlin 协程 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...那么让我们来看看具体怎样使用命令式的风格写出类似的异步代码吧! 如何使用协程? 协程基于一种新的函数类型,叫做挂起函数。我们可以在函数名称前使用一种新的语言关键字 suspend 来标记。...,它可以在其他的协程中使用并被控制执行。...在 C# 中 async 和 await 都是关键字 在 C# 中 async 函数只能返回一个 Task 实例或者返回空 如果你仔细观察协程的这个例子,你会看到在 Kotlin 中, launch{}...通过使用 CoroutineStart.LAZY 这个值,可以让协程只在开发者显式调用返回的 Deferred 实例或者 Job 实例的 await() 方法或者 join() 方法才开始运行。
它启动了一个单独的协程与其它所有的协程一起并发的工作。...请注意,使用协程进行并发总是显式的。 惰性启动的 async 可选的,async 可以通过将 start 参数设置为 CoroutineStart.LAZY 而变为惰性的。...注意,如果我们只是在 println 中调用 await,而没有在单独的协程中调用 start,这将会导致顺序行为,直到 await 启动该协程 执行并等待至它结束,这并不是惰性的预期用例。...构建async 风格的函数 我们可以定义异步风格的函数来 异步 的调用 doSomethingUsefulOne 和 doSomethingUsefulTwo 并使用 async 协程建造器并带有一个显式的...在 Kotlin 的协程中使用这种风格是强烈不推荐的, 原因如下所述。
一.协程的定义 最近看了一本有关kotlin协程的书籍,对协程又有了不一样的了解,所以准备写一个关于kotlin协程系列的文章。 ... 为了便于区分,我们将Kotlin协程的基础设施层创建的协程称为简单协程,将基于业务框架层创建的协程称为复合协程,这一小节主要来讨论简单协程的使用。...我们可以使用它来创建协程,但是创建的协程不会立马执行。...(4)函数的挂起 我们已经知道使用suspend关键字可以声明一个挂起函数,挂起函数只能在协程体内或其他挂起函数中调用。这样一来,整个kotlin语言体系就可以分为两派:普通函数和挂起函数。...在回答这个问题之前我们先来了解一个概念:挂起点,在协程内部挂起函数的调用处被称为挂起点,只有当挂起点处发生异步调用,当前协程才会被挂起,直到这个协程对应的continuation实例的resumeWith
所以请打开Kotlin中文网。很多人说kotlin官网教程很不详细,其实不然,kotlin中文网教程很详细。 回到正题: 什么是协程?...异步编程 体验 语言级 理念 注意上面几个关键点和一些实际使用,不难明白 Kotlin协程是基于Kotlin语法从而延伸的一个异步编程框架,它并没有带来多少性能上的体验,它能实现的,你用线程池同样也可以实现...,但对于使用角度的来说,协程努力打造一个 "同步方式,异步编程的" 思想,作为开发者来说,我们可以更懒了,切换线程,withContext即可,协程带来了开发上的舒适,但这种舒适是基于 Kotlin 的语法...所以我希望大家刚入手协程时,多从语言角度去理解。 那么,协程是什么? 协程就是一个基于Kotlin语法的异步框架,它可以使开发者以同步的方式,写成异步的代码,而无需关注多余操作。...,使用者的角度入手,带着大家从侧面去理解协程,希望大家都能有自己的理解。
协程更像是一个管理者的秘书,它让我们从复杂的逻辑中得到解放,只需要告诉秘书执行流程,其他的都交由秘书安排 以上就是我对协程的理解,接下来来学习如何使用kotlin的协程 一、实现异步任务相同功能 如果说我们有一个耗时操作...和resume suspend:也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量 resume:用于让已暂停的协程从其暂停出继续执行 1.挂起函数 使用suspend关键字修饰的函数叫做挂起函数...,也就是我们之前代码指定的Dispatchers,即使在主线程也是如此 官方提供的调度器为以下三种: 调度器 四、协程的两部分 kotlin的协程实现分为两个层次,我们之前使用的都是业务框架层 1...,是不过业务框架层已经做了封装 五、结构化并发 当某个协程任务丢失,无法追踪,会导致资源浪费,甚至发送一个无用的网络请求,这种情况称为任务泄漏 为了解决任务泄漏,kotlin引入了结构化并发机制 使用结构化并发可以做到...销毁,协程还是会运行 2.MainScope:在Activity中使用,可以在onDestroy中取消 3.ViewModelScope:只能在ViewModel中使用,绑定ViewModel的生命周期
介绍 这里一开始不打算介绍什么是协程,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin的协程像是“另一种RxJava”,但是比RxJava要高效。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin的协程,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...launch 使用launch()创建一个协程,会返回一个Job对象。...发现withContext()只能在协程或suspend方法中使用。所以,在方法前加上suspend就不会报错了。...总结 协程基本的使用到这里就可以告一段落了,主要介绍了协程给我带来了什么,可以在什么场景下用,怎么用。相信这样同步的方式来写异步,这样写出来的代码一定是非常直观、清晰的。 然而,有关什么是协程?
领取专属 10元无门槛券
手把手带您无忧上云