Kotlin Flow 解决了什么问题? ?...Flow 是协程的扩展,如果要在 Room 和 Retrofit 中使用,Room 和 Retrofit 需要支持协程才可以,在 Retrofit >= 2.6.0 和 Room >= 2.1 版本都支持协程...的数据 emit(it) } } liveData{ ... } 协程构造方法提供了一个协程代码块,产生的是一个不可变的 LiveData,emit() 方法则用来更新...asLiveData 是 Flow 的扩展函数,返回值是一个 LiveData liveData{ ... } 协程构造方法提供了一个协程代码块,在 liveData{ ... } 中执行协程代码 collect...Observer { // 将数据显示在页面上 }) 方式二: 使用 LiveData 协程构造方法 (coroutine builder) 提供的协程代码块,产生的是一个不可变的 LiveData
也就是 Kotlin 的协程 (Coroutine)。 协程的优势 协程的优点主要来自三个方面: 很容易离开主线程。...但协程可以让开发者只需要一行代码就完成这个工作,而且没有累人的回调处理。 样板代码最少。协程完全活用了 Kotlin 语言的能力,包括 suspend 方法。...val result = liveData { emit(doComputation()) } } 这个 liveData 协程构造方法提供了一个协程代码块,这个块就是...如前所述,我们使用 LiveData 连接 View 和 ViewModel,而在 ViewModel 这里我们则使用刚刚提到的 liveData 协程构造方法来打通 LiveData 和协程,再往右就是调用...liveData 协程构造方法。
网络请求这个就不用说了,RxJava 配合 Retrofit 来做网络请求,各种复杂操作和线程切换,谁用谁知道——现在用协程就可以了,比 RxJava 方便;而 event bus,当时比较火的是两个开源库...我要说的是 Kotlin,Kotlin 在 2017 得到了 Android 官方的公开支持,在接下来这几年里,Kotlin 自身越来越完善,它的协程也越来越完善。...协程的 Flow 和 RxJava 的功能范围非常相似——其实我觉得就是一样的——但是 Flow 是协程里必不可少的一部分,而协程是 Kotlin 里必不可少的一部分,而 Kotlin 是 Android...视频(文章)开头那个问题,Yigit 的回答是:LiveData 不会被废弃,因为两个原因: 用 Java 写 Android 的人还需要它——Flow 是协程的东西,所以如果你是用 Java 的,那其实没办法用...另一方面,在用 LiveData 的人,确实可以考虑摘除它了;但也不是着急忙慌地把它拿走,它不是毒药不是地雷,只是协程的 Flow 现在可以做这件事了,而未来 Flow 一定是会成为主流的,就像现在的
阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。...首先是父协程得到执行,然后才是子协程。 重点是这两段协程都在同一个线程main里完成。这里就带来一个有趣的问题, runBLocking{}和平时常用的launch有什么区别?...这里给出结果,改用GlobalScope.launch之后,子协程会在一个独立的线程里运行。 runBlocking 在kotlin协程官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...在创建完coroutine后就进入派发流程了,这部分和Kotlin协程-一个协程的生命周期中的逻辑比较相似,下面也会讲到。...猜测是为了避免协程嵌套太多,导致stack over flow的问题出现。
《Kotlin协程》均基于Kotlinx-coroutines 1.3.70 新开个坑,专门讲kotlin的协程。聊协程之前先说一下具体聊的是协程的什么内容。 · 协程是什么? · 什么时候用协程?...· 协程的核心是什么? · kotlin的协程和其他语言的协程有什么异同? kotlin的协程的出现其实比kotlin语言还晚一点。在当前这个版本,协程甚至都还处于一个不稳定的迭代版本中。...作为一个独立的依赖包,它的源码可以从github上获取,《Kotlin协程》分析的源码就是以github上的master分支为参考。 协程没那么难 协程的出现是为了解决异步编程中遇到的各种问题。...协程其实没那么容易 对于经常用协程开发的人来说,有几个很有意思的问题值得思考下。· 上面代码中的Thread.sleep()可以改成delay()吗?...这个问题涉及到Kotlin协程的Scope,调度,也是协程的实现核心逻辑 Kotlin不是第一个提出协程的 实际上在Kotlin之前就有不少语言实践了协程这个概念。比如python,golang。
协程设计的初衷是为了解决并发问题,让 「协作式多任务」 实现起来更加方便。 协程就是 Kotlin 提供的一套线程封装的 API,但并不是说协程就是为线程而生的。...不过,我们学习 Kotlin 中的协程,一开始确实可以从线程控制的角度来切入。因为在 Kotlin 中,协程的一个典型的使用场景就是线程控制。...c.suspend suspend是 Kotlin 协程最核心的关键字,几乎所有介绍 Kotlin 协程的文章和演讲都会提到它。它的中文意思是「暂停」或者「可挂起」。...而恢复这个功能是协程的,如果你不在协程里面调用,恢复这个功能没法实现,所以也就回答了这个问题:为什么挂起函数必须在协程或者另一个挂起函数里被调用。...4,Kotlin 协程 的实战 5,漫画:什么是协程? 向大佬们致敬。
关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...再谈 Retrofit 的协程扩展 4.1 Jake Wharton 的 Adapter 存在的问题 我在破解 Kotlin 协程 - 入门篇(https://www.bennyhuo.com/2019...:retrofit2-kotlin-coroutines-adapter:0.9.2' 它确实可以完成网络请求,不过有细心的小伙伴发现了它的问题:它怎么取消呢?...,那么问题来了,这里并没有告诉它父协程究竟是谁,因此也就谈不上作用域的事儿了,这好像我们用 GlobalScope.launch 启动了一个协程一样。...最后我们还分析了一下 Retrofit 的协程扩展的一些问题和解决方法,这个例子也进一步可以引发我们对协程作用域以及如何将现有程序协程化的思考。
搞清楚内部概念对分析协程源码来说非常关键。 协程的最小粒度-Coroutine 对没接触过协程的人来说,一个OOP代码的最小调度粒度是函数。...在协程中,最小的调度粒度是协程,在kotlin中叫coroutine。...外部概念和内部概念 协程中外部概念和内部概念的差别很大。对应开发者来说,一个协程的最小粒度coroutine,在协程的内部概念中叫DispatchedContinuation。...为什么可以提升效率,在Kotlin协程-协程设计的基础中有具体解释。...协程框架三大件,Continuation-Disptacher-Scheduler Kotlin的协程从框架设计上就考虑了跨平台的问题。 这里的跨平台不是指安卓和服务端。
实现这个能力的关键在于协程实现了continuation接口。...从协程源码里猜测,它肯定是一个实现了continuation的类,因此它才能有可重入性。...把编译后的字节码用jd-gui打开可以看到,我们所写的协程会给编译器插入代码,实现SuspendLambda接类, ?...但这个函数又再次是 kotlin 标准库里的。...所以会看到虽然协程的外部概念很清晰,只是一个 coroutine,但在协程内部,实际上支撑它的还有Continuation,Dispatch,Intercept。还是挺复杂的。
我们今天主要说 Kotlin。...我们说过,启动协程需要三样东西,分别是 上下文、启动模式、协程体,协程体 就好比 Thread.run 当中的代码,自不必说。 本文将为大家详细介绍 启动模式。...在 Kotlin 协程当中,启动模式是一个枚举: public enum class CoroutineStart { DEFAULT, LAZY, @ExperimentalCoroutinesApi...在 Nodejs 中,Kotlin 协程的默认调度器则并没有实现线程的切换,输出结果也会略有不同,这样似乎更符合 JavaScript 的执行逻辑。 更多调度器的话题,我们后续还会进一步讨论。...我们使用线程的时候,想要让线程里面的任务停止执行也会面临类似的问题,但遗憾的是线程中看上去与 cancel 相近的 stop 接口已经被废弃,因为存在一些安全的问题。
关键词:Kotlin 异步编程 协程 上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 ? 1....Kotlin 协程设计者也特别害怕大家注意不到这一点,还特地废弃了两个 API 并且开了一个 issue 说我们要重做这套 API,这两个可怜的家伙是谁呢?...3.4 线程安全问题 Js 和 Native 的并发模型与 Jvm 不同,Jvm 暴露了线程 API 给用户,这也使得协程的调度可以由用户更灵活的选择。...越多的自由,意味着越多的代价,我们在 Jvm 上面编写协程代码时需要明白一点的是,线程安全问题在调度器不同的协程之间仍然存在。...通过这个例子我们可以知道,实际上启动一个协程只需要有一个 lambda 表达式就可以了,想当年 Kotlin 1.1 刚发布的时候,我写了一系列的教程都是以标准库 API 为基础的,后来发现标准库的 API
关键词:Kotlin 协程 协程挂起 任务挂起 suspend 非阻塞 协程的挂起最初是一个很神秘的东西,因为我们总是用线程的概念去思考,所以我们只能想到阻塞。不阻塞的挂起到底是怎么回事呢?...协程调用完全一样。...就是 Kotlin 协程编译之后产生的字节码。...协程体的执行就是一个状态机,每一次遇到挂起函数,都是一次状态转移,就像我们前面例子中的 label 不断的自增来实现状态流转一样 如果能够把这两点认识清楚,那么相信你在学习协程其他概念的时候就都将不再是问题了...当然,这一篇内容的安排更多是为后面的序列篇开路,Kotlin 的 Sequence 就是基于协程实现的,它的用法很简单,几乎与普通的 Iterable 没什么区别,因此序列篇我们会重点关注它的内部实现原理
【翻译】深入 Kotlin 协程 2017-10-26 by Liuqingwen | Tags: Kotlin 翻译 | Hits ? 一、前言 翻译好的文章也是一种学习方法!...原文作者:Adrian Bukros 二、正文 编写 Kotlin 协程相关的文章是当下比较流行的一个话题,这当然是有极好的理由支撑着的。...但是这里面有很大的问题。...在 C# 5.0 中,追溯到 2012 年,关于异步函数微软提出了一个特性,非常类似 Kotlin 中的协程: public async Task doWork() { // do some...在 C# 中 async 和 await 都是关键字 在 C# 中 async 函数只能返回一个 Task 实例或者返回空 如果你仔细观察协程的这个例子,你会看到在 Kotlin 中, launch{}
它启动了一个单独的协程与其它所有的协程一起并发的工作。...请注意,使用协程进行并发总是显式的。 惰性启动的 async 可选的,async 可以通过将 start 参数设置为 CoroutineStart.LAZY 而变为惰性的。...在这个模式下,只有结果通过 await 获取的时候协程才会启动,或者在 Job 的 start函数调用的时候。...注意,如果我们只是在 println 中调用 await,而没有在单独的协程中调用 start,这将会导致顺序行为,直到 await 启动该协程 执行并等待至它结束,这并不是惰性的预期用例。...在 Kotlin 的协程中使用这种风格是强烈不推荐的, 原因如下所述。
在进行业务开发时,我们通常会基于官方的协程框架(kotlinx.coroutines)来运用Kotlin协程优化异步逻辑,不过这个框架过于庞大和复杂,如果直接接触它容易被劝退。...在jvm上,我们很自然的就可以想到使用ScheduledExecutorService,问题就这样迎刃而解了。...,不过还有一个问题没有解决,我们的协程是如何实现并发的?...调度的本质就是解决协程在挂起点恢复后的协程逻辑在哪里运行的问题,由此给出调度器的接口定义: interface Dispatcher{ fun dispatch(block:()->Unit)...该作用域包括以下三种: 顶级作用域:没有父协程的协程所在的作用域为顶级作用域 协同作用域:协程中启动新的协程,新协程为所在协程的子协程,这种情况下子协程所在的作用域默认为协同作用域。
一.协程的定义 最近看了一本有关kotlin协程的书籍,对协程又有了不一样的了解,所以准备写一个关于kotlin协程系列的文章。 ...三.Kotlin协程的基础设施 Kotlin的协程实现分为两个层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持 业务框架层:协程的上层框架支持,也就是在基础设施层的基础上再封装一层... 为了便于区分,我们将Kotlin协程的基础设施层创建的协程称为简单协程,将基于业务框架层创建的协程称为复合协程,这一小节主要来讨论简单协程的使用。...在回答这个问题之前我们先来了解一个概念:挂起点,在协程内部挂起函数的调用处被称为挂起点,只有当挂起点处发生异步调用,当前协程才会被挂起,直到这个协程对应的continuation实例的resumeWith...那么我们最关心的问题来了,协程如何处理线程的调度?
很高兴,你终于追寻这个问题了,也许你正感到迷茫,各路大神对协程的理解不一,有人说它是线程框架,有人说它比线程更轻,希望我这篇博文可以帮你从另一个角度简单理解协程。...所以请打开Kotlin中文网。很多人说kotlin官网教程很不详细,其实不然,kotlin中文网教程很详细。 回到正题: 什么是协程?...异步编程 体验 语言级 理念 注意上面几个关键点和一些实际使用,不难明白 Kotlin协程是基于Kotlin语法从而延伸的一个异步编程框架,它并没有带来多少性能上的体验,它能实现的,你用线程池同样也可以实现...,但对于使用角度的来说,协程努力打造一个 "同步方式,异步编程的" 思想,作为开发者来说,我们可以更懒了,切换线程,withContext即可,协程带来了开发上的舒适,但这种舒适是基于 Kotlin 的语法...所以我希望大家刚入手协程时,多从语言角度去理解。 那么,协程是什么? 协程就是一个基于Kotlin语法的异步框架,它可以使开发者以同步的方式,写成异步的代码,而无需关注多余操作。
如何理解协程 协程是一种不同于进程和线程的存在,其本质是一种函数,同一线程中的多个协程是串行执行的,但为了理解仍然需要三者一起对比。...info: 我认为关于协程的全部,最佳参考为Google官方编写的文章: 谷歌开发者:在 Android 开发中使用协程 | 背景介绍 在安卓开发中使用协程 Kotlin 1.3版本中开始引入了一种全新处理并发的方式...:协程,可以在 Android 平台上使用它来简化异步执行的代码,主要用来解决两个问题: 处理耗时任务 (Long running tasks),这种任务常常会阻塞住主线程; 保证主线程安全 (Main-safety...在 Kotlin 中,所有协程都必须在调度器中运行,即使它们是在主线程上运行也是如此。suspend并不代表后台执行,在哪里执行由调度器决定。协程可以自行暂停,而调度器负责将其恢复。...调用suspend函数 调用UI函数 更新LiveData Dispatchers.IO 非主线程 专为磁盘和网络IO进行了优化 数据库 文件读写 网络处理 Dispatchers.Default 非主线程
1.前言 前面两节,我们运用了kotlin提供的简单协程去实现了一套更易用的复合协程,这些基本上是以官方协程框架为范本进行设计和实现的。...虽然我们还没有直接接触kotlin官方协程框架,但对它的绝大多数功能已经了如指掌了。...本节,我们来探讨一下官方协程框架的更多功能,并将其运用到实际的生产当中,在这里,我以在Android中使用kotlin官方协程框架为例进行讲述。...2.launch函数启动一个协程 在Android开发中,我们一般将协程的作用域和Android组件的lifeCycle绑定在一起,这样,当组件销毁的时候,协程的作用域就会取消,协程也就销毁了,这样不会造成内存泄漏...5.协程的超时取消 kotlin官方协程框架为我们提供了一个withTimeout()函数用于执行超时取消设置,这个api的定义如下: public suspend fun withTimeout
一、什么是协程 说明:仅限于 JVM和Android上,协程就是一个类似安卓handler和java中线程池的一种线程框架,协程只是对线程高级封装的API,协程的本质还是线程——协程=漂亮的多线程。...挂起函数必须要带suspend修饰,但不是说被suspend修饰的函数就是线程切换的点,而是这个挂起函数有直接或间接的调用kotlin协程内自带的挂起函数来实现挂起,从而才实现线程的切换;suspend...修饰只是提醒kotlin这一块是一个耗时操作,避免卡顿。...6、Flow流:是冷流,就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。...我们可以将线程的职责分成生产者和消费者,并通过消息传递的方式将它们解耦,不需要再依赖共享内存; 3.最后,选择使用消息发送的方式,通过保证同一时间只有一个活跃的线程能够访问数据,能够从设计上天然地避免线程竞争和数据冲突的问题