1.简介 Retrofit对协程的支持非常的简陋。...在kotlin中使用不符合kotlin的优雅 interface TestServer { @GET("banner/json") suspend fun banner(): ApiResponse...kotlin应该一行代码解决问题,才符合kotlin的优雅 使用本框架后 interface TestServer { @GET("banner/json") suspend fun awaitBanner...Exception e) { return KotlinExtensions.suspendAndThrow(e, continuation); } } } 后面直接交给协程去调用...: Retrofit): CallAdapter?
前言 最近一直闭关修炼Kotlin,说实话真香真好用,刚好公司准备交给我一个新项目,于是打算直接用Kotlin来构建项目。刚好整体架构搭建完毕了,于是把网络请求这一部分先分享给大家。...这次使用到的是 协程+ retrofit +mvvm的模式,我这儿直接用一个简单的demo来看一下具体的实现方式吧。...:converter-gson:2.4.0' implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter...网络请求在协程中,并且在IO调度单元,所以不用担会阻塞主线程 协程 + ViewModel + LiveData实现 上面也只是简单的实现,只不过是换成了协程,在项目中,还可以进一步封装,方便使用前面也提到了...因为在协程进行请求的过程中,若此时ViewModel销毁,里面的协程正在请求的话,将无法销毁,出现内存泄漏,所以在ViewModel onCleared 里面,即使结束协程任务,参考代码如下。
Coroutine是kotlin官方文档上推荐的,个人理解,其实就是一个轻量级的线程库 使用前加依赖 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core...使用 .await()来获取最终数据 import kotlinx.coroutines.* import kotlin.system.* fun main() = runBlocking...的区别 2.1 retrofit的实现 实体类 class Repo : Serializable { var id: Long?...同时,retrofit的构造函数中addCallAdapterFactory也有所变化 val retrofit = Retrofit.Builder() .baseUrl...:retrofit2-kotlin-coroutines-adapter:0.9.2' 接下来看最重要的网络请求那一段 try { launch(MyDispatcher
阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。...这里给出结果,改用GlobalScope.launch之后,子协程会在一个独立的线程里运行。 runBlocking 在kotlin协程官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...但实际情况跟注释有点不同,如果在 runBlocking 中开一个 GlobalScope.launch,并且在里面延时很久,那么外面的线程其实是不会等待 GlobalScope 里的协程完成的。...在创建完coroutine后就进入派发流程了,这部分和Kotlin协程-一个协程的生命周期中的逻辑比较相似,下面也会讲到。...这个问说明,runBLocking{}这种协程,它的运行逻辑是先把父协程放队列里,然后取出来执行,执行完毕再把子协程入队,再出队子协程,用同样的方式递归。
《Kotlin协程》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin的协程。聊协程之前先说一下具体聊的是协程的什么内容。 · 协程是什么? · 什么时候用协程?...· 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...存活 } 上面的代码是一个常规启动协程的方式,关键函数只有 launch,delay,这两个函数是kotlin协程独有的。...这个问题涉及到Kotlin协程的Scope,调度,也是协程的实现核心逻辑 Kotlin不是第一个提出协程的 实际上在Kotlin之前就有不少语言实践了协程这个概念。比如python,golang。...kotlin的协程还在发展 如果去看kotlin的协程源码的话会发现里面有很多 exeprimental 的api和实现逻辑。
协程设计的初衷是为了解决并发问题,让 「协作式多任务」 实现起来更加方便。 协程就是 Kotlin 提供的一套线程封装的 API,但并不是说协程就是为线程而生的。...不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。...c.suspend suspend是 Kotlin 协程最核心的关键字,几乎所有介绍 Kotlin 协程的文章和演讲都会提到它。它的中文意思是「暂停」或者「可挂起」。...所以这个 suspend,其实并不是起到把任何把协程挂起,或者说切换线程的作用。 真正挂起协程这件事,是 Kotlin 的协程框架帮我们做的。...4,Kotlin 协程 的实战 5,漫画:什么是协程? 向大佬们致敬。
关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...之后再来执行后面的这段代码(也就是 log(2));而在这期间,我们在 ③ 处对刚才启动的协程触发了取消,因此在 ② 处的 delay还没有回调的时候协程就被取消了,因为 delay 可以响应取消,因此...再谈 Retrofit 的协程扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin 协程 - 入门篇(https://www.bennyhuo.com/2019...需要指出的是,这段代码片段源自 gildor/kotlin-coroutines-retrofit(https://github.com/gildor/kotlin-coroutines-retrofit...最后我们还分析了一下 Retrofit 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。
我们今天主要说 Kotlin。...在 Kotlin 协程当中,启动模式是一个枚举: public enum class CoroutineStart { DEFAULT, LAZY, @ExperimentalCoroutinesApi...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...而对于 join, ... log(3) job.join() log(4) 因为要等待协程执行完毕,因此输出的结果一定是: 14:47:45:963 [main] 1 14:47:46:054 [main...,因此 1、2 会连续在同一线程中执行, delay 是挂起点,因此 3 会等 100ms 后再次调度,这时候 4 执行, join 要求等待协程执行完,因此等 3 输出后再执行 5。
搞清楚内部概念对分析协程源码来说非常关键。 协程的最小粒度-Coroutine 对没接触过协程的人来说,一个OOP代码的最小调度粒度是函数。...在协程中,最小的调度粒度是协程,在kotlin中叫coroutine。...launch 2 > Thread: ${Thread.currentThread().name}") delay(100L) println("Hello,") // 协程已在等待时主线程还在继续...为什么可以提升效率,在Kotlin协程-协程设计的基础中有具体解释。...协程框架三大件,Continuation-Disptacher-Scheduler Kotlin的协程从框架设计上就考虑了跨平台的问题。 这里的跨平台不是指安卓和服务端。
实现这个能力的关键在于协程实现了continuation接口。...从协程源码里猜测,它肯定是一个实现了continuation的类,因此它才能有可重入性。...把编译后的字节码用jd-gui打开可以看到,我们所写的协程会给编译器插入代码,实现SuspendLambda接类, ?...但这个函数又再次是 kotlin 标准库里的。...所以会看到虽然协程的外部概念很清晰,只是一个 coroutine,但在协程内部,实际上支撑它的还有Continuation,Dispatch,Intercept。还是挺复杂的。
关键词:Kotlin 异步编程 协程 上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 ? 1....协程上下文 调度器本质上就是一个协程上下文的实现,我们先来介绍下上下文。...Kotlin 协程设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?...上一篇文章我们提到了 suspend main 会启动一个协程,我们示例中的协程都是它的子协程,可是这个最外层的协程到底是怎么来的呢?...通过这个例子我们可以知道,实际上启动一个协程只需要有一个 lambda 表达式就可以了,想当年 Kotlin 1.1 刚发布的时候,我写了一系列的教程都是以标准库 API 为基础的,后来发现标准库的 API
关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...简单来说就是,对于 suspend 函数,不是一定要挂起的,可以在需要的时候挂起,也就是要等待的协程还没有执行完的时候,等待协程执行完再继续执行;而如果在开始 join 或者 await 或者其他 suspend...,需要等待结果,②③是协程已经执行完可以直接拿到异常和正常结果的两种情况。...就是 Kotlin 协程编译之后产生的字节码。...当然,这一篇内容的安排更多是为后面的序列篇开路,Kotlin 的 Sequence 就是基于协程实现的,它的用法很简单,几乎与普通的 Iterable 没什么区别,因此序列篇我们会重点关注它的内部实现原理
它启动了一个单独的协程与其它所有的协程一起并发的工作。...我们首先 调用 one,然后调用 two,接下来等待这个协程执行完毕。...注意,如果我们只是在 println 中调用 await,而没有在单独的协程中调用 start,这将会导致顺序行为,直到 await 启动该协程 执行并等待至它结束,这并不是惰性的预期用例。...在 Kotlin 的协程中使用这种风格是强烈不推荐的, 原因如下所述。...(即 two)失败,第一个 async 以及等待中的父协程都会被取消: Second child throws an exception First child was cancelled Computation
【翻译】深入 Kotlin 协程 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...原文作者:Adrian Bukros 二、正文 编写 Kotlin 协程相关的文章是当下比较流行的一个话题,这当然是有极好的理由支撑着的。...一边在 UI 上显示花哨的加载动画一边等待网络请求就是一个简单的例子,这不得不使用异步代码来解决。...程序仍然需要等待后台任务完成后在 UI 上执行返回结果的显示。...在 C# 5.0 中,追溯到 2012 年,关于异步函数微软提出了一个特性,非常类似 Kotlin 中的协程: public async Task doWork() { // do some
在进行业务开发时,我们通常会基于官方的协程框架(kotlinx.coroutines)来运用Kotlin协程优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...3.2实现join函数 join函数是一个挂起函数,他需要等待协程的执行,此时会有两种情况:被等待的协程已经执行完成,join函数就不会挂起,而是立马返回;被等待的协程尚未完成,此时join将协程挂起...doOnCompleted{result-> continuation.resume(Unit) } } 3.3有返回值的async函数 现在,我们已经知道如何启动协程和等待协程完成了...该作用域包括以下三种: 顶级作用域:没有父协程的协程所在的作用域为顶级作用域 协同作用域:协程中启动新的协程,新协程为所在协程的子协程,这种情况下子协程所在的作用域默认为协同作用域。...除了这三种作用域中提到的行为外,父子协程之间还存在以下规则: 父协程被取消,则所有的子协程均被取消 父协程需要等待子协程执行完毕后才最终进入完成状态 子协程会继承父协程的协程上下文中的元素,如果自身有相同的
最近回归看了一下Retrofit的源码,主要是因为项目接入了协程,所以想研究一下Retorift是如何支持协程的。...由于篇幅有限,有关协程的原理实现就点到为止,后续我会专门写一个协程系列,希望到时能够让读者们认识到协程的真面目,大家可以期待一下。 现在我们已经知道了Retrofit如何判断一个方法是否使用了协程。...接口方法是协程,同时返回类型是Response类型 //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object...接口方法是协程,同时返回类型是body,即自定义的model类型 //noinspection unchecked Kotlin compiler guarantees ReturnT to...今天就这样吧,协程部分就分析到这里,Retrofit的整个协程实现部分就分析结束了,我将关键点都特别进行了标注与说明,希望对分析Retrofit的协程实现有所帮助。
所以请打开Kotlin中文网。很多人说kotlin官网教程很不详细,其实不然,kotlin中文网教程很详细。 回到正题: 什么是协程?...异步编程 体验 语言级 理念 注意上面几个关键点和一些实际使用,不难明白 Kotlin协程是基于Kotlin语法从而延伸的一个异步编程框架,它并没有带来多少性能上的体验,它能实现的,你用线程池同样也可以实现...,但对于使用角度的来说,协程努力打造一个 "同步方式,异步编程的" 思想,作为开发者来说,我们可以更懒了,切换线程,withContext即可,协程带来了开发上的舒适,但这种舒适是基于 Kotlin 的语法...所以我希望大家刚入手协程时,多从语言角度去理解。 那么,协程是什么? 协程就是一个基于Kotlin语法的异步框架,它可以使开发者以同步的方式,写成异步的代码,而无需关注多余操作。...观察上面的打印日志,我们不难发现,在调用 delay 函数时,线程并没有停下,相对来说,只是我们的协程代码块被挂起,等待恢复。只有前面的挂起函数执行结束,我们的协程代码块才能继续执行。
一.协程的定义 最近看了一本有关kotlin协程的书籍,对协程又有了不一样的了解,所以准备写一个关于kotlin协程系列的文章。 ...线程在等待某种资源或者等待I/O操作完成时,会被阻塞,并且在阻塞的期间还一直霸占着CPU资源。...三.Kotlin协程的基础设施 Kotlin的协程实现分为两个层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持 业务框架层:协程的上层框架支持,也就是在基础设施层的基础上再封装一层... 为了便于区分,我们将Kotlin协程的基础设施层创建的协程称为简单协程,将基于业务框架层创建的协程称为复合协程,这一小节主要来讨论简单协程的使用。...(6)协程的拦截器 我们现在已经知道Kotlin协程可以通过调用挂起函数实现挂起,可以通过Continuation的恢复调用实现恢复,还知道协程可以通过绑定一个上下文来设置一些数据来丰富协程的能力,
挂起函数必须要带suspend修饰,但不是说被suspend修饰的函数就是线程切换的点,而是这个挂起函数有直接或间接的调用kotlin协程内自带的挂起函数来实现挂起,从而才实现线程的切换;suspend...4.runBlocking {}会等待所有子协程执行完毕 2、非阻塞式挂起:就是用阻塞式的代码写法,实现了非阻塞式的功能(同步代码写法实现异步任务) runBlocking本身会阻塞当前线程去等待...3、await()和join()都会阻塞当前父协程去等待子协程执行完毕,只是await()可以返回一个结果值 4、UNDISPATCHED:这个模式是立即执行,其他模式是立即调度或者等待调度,立即执行比立即调度优先级高...5、大写的CoroutineScope没有继承runBlocking协程的上下文,所以这种情况的runBlocking不会等待子协程CoroutineScope执行完毕。...6、Flow流:是冷流,就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。
介绍 这里一开始不打算介绍什么是协程,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin的协程像是“另一种RxJava”,但是比RxJava要高效。...这里先有个大致的印象,先了解下协程在实际中的作用,回头再去看它的原理,或许会更容易些。 一开始查了好多关于协程资料(包括官方完档),发现不同的人说的不大一样,最后越看越乱。...于是我决定一开始先不说什么是协程。 作用 上面说到,协程用起来“像是另一种RxJava”。 那么是不是可以用协程来开启一个异步操作?切换线程? 答案是肯定的,不仅可以做到,而且写起来也很简单。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin的协程,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...总结 协程基本的使用到这里就可以告一段落了,主要介绍了协程给我带来了什么,可以在什么场景下用,怎么用。相信这样同步的方式来写异步,这样写出来的代码一定是非常直观、清晰的。 然而,有关什么是协程?