首页
学习
活动
专区
圈层
工具
发布

破解 Kotlin 协程(1) - 入门篇

改造成协程 你当然可以改造成 RxJava 的风格,但 RxJava 比协程抽象多了,因为除非你熟练使用那些 operator,不然你根本不知道它在干嘛(试想一下 retryWhen)。...讲了这么多,请大家记住一点:从执行机制上来讲,协程跟回调没有什么本质的区别。...;而经常听到所谓的协程更轻量的意思是,协程并不会映射成内核线程或者其他这么重的资源,它的调度在用户态就可以搞定,任务之间的调度并非抢占式,而是协作式的。...小结 我们先通过例子来引入,从大家最熟悉的代码到协程的例子开始,演化到协程的写法,让大家首先能从感性上对协程有个认识,最后我们给出了协程的定义,也告诉大家协程究竟能做什么。...这篇文章没有追求什么内部原理,只是企图让大家对协程怎么用有个第一印象。

84500

Android面试官问协程,你会如何选择应对这些高级问题?

在什么情况下更适合使用协程或RxJava? 出发点: 可以从语法、错误处理等方面展开,适用场景可以根据各自的优点进行应用。...参考简答:协程和RxJava的异同点: 语法: 协程更贴近传统的同步代码,使用async/await等语法,而RxJava使用链式调用的方式。...适用场景: 协程: 更适合简单的异步任务,对于并发性能要求不是很高的场景。 RxJava: 适用于复杂的异步任务,需要处理背压和具备更多操作符的场景。 协程的性能优化 问题: 如何优化协程的性能?...协程间的通信 问题:如何实现协程间的通信? 出发点: 这个问题涉及到协程之间的数据传递和通信机制,包括协程间如何进行协作和共享数据。...出发点: 这个问题可以从协程的组合与自定义调度器等角度延伸。 参考简答:协程的高级应用场景包括: 状态机: 使用协程实现状态机,可以清晰地表达异步状态切换的逻辑。

43410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    理解协程、LiveData 和 Flow

    如何取消该操作的时间太晚,可能会浪费很多额外的资源;而如果取消的太早,又会出现频繁重启操作的情况。 在实际应用中,以我们的 Android Dev Summit 应用为例,里面涉及到的作用域非常多。...让我们来看另一个常见用例,比如当用户在 UI 中选中一些元素,然后将这些选中的内容显示出来。...绝大部分情况下,协程的取消操作是自动的,毕竟我们在对应的作用域里启动一个协程时,也同时明确了它会在何时被取消。但我们有必要讲一讲如何在协程内部来手动取消协程。...注意,如果这个协程已经被取消,则 resume 调用也会被忽略。开发者可以在协程被取消时主动取消 API 请求。 2....相信看到这里,您对如何在实际应用中使用协程、LiveData 和 Flow 已经有了比较系统的认识。

    2.3K20

    破解 Kotlin 协程(3) - 协程调度篇

    关键词:Kotlin 异步编程 协程 上一篇我们知道了协程启动的几种模式,也通过示例认识了 launch 启动协程的使用方法,本文将延续这些内容从调度的角度来进一步为大家揭示协程的奥义。 ? 1....接下来我们把用例拿出来: suspend fun main() { GlobalScope.launch(MyContinuationInterceptor()) { log(1...我们通过 launch启动了一个协程,为它指定了我们自己的拦截器作为上下文,紧接着在其中用 async 启动了一个协程, async 与 launch 从功能上是同等类型的函数,它们都被称作协程的 Builder...这里又有大家没见过的内容啦, suspendCoroutine 这个方法并不是帮我们启动协程的,它运行在协程当中并且帮我们获取到当前协程的 Continuation 实例,也就是拿到回调,方便后面我们调用它的...对比前面的 RxJava 的做法,你会发现这段代码其实很容易理解,你甚至会发现协程的使用场景与 RxJava 竟是如此的相似。

    84120

    破解 Kotlin 协程 - 入门篇

    改造成协程 你当然可以改造成 RxJava 的风格,但 RxJava 比协程抽象多了,因为除非你熟练使用那些 operator,不然你根本不知道它在干嘛(试想一下 retryWhen)。...讲了这么多,请大家记住一点:从执行机制上来讲,协程跟回调没有什么本质的区别。...;而经常听到所谓的协程更轻量的意思是,协程并不会映射成内核线程或者其他这么重的资源,它的调度在用户态就可以搞定,任务之间的调度并非抢占式,而是协作式的。...小结 我们先通过例子来引入,从大家最熟悉的代码到协程的例子开始,演化到协程的写法,让大家首先能从感性上对协程有个认识,最后我们给出了协程的定义,也告诉大家协程究竟能做什么。...这篇文章没有追求什么内部原理,只是企图让大家对协程怎么用有个第一印象。

    58520

    是继续Rxjava还是该试试Kotlin的协程?

    1.什么是协程 1.1协程定义 我第一次接触协程是在python的教程里,这里拿来用来解释一下:子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B...所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。...关于协程还有一些其他的创建和使用方法,有兴趣的可以去看看官方教程。 3.Rxjava VS 协程 协程相对RxJava有什么优点呢?...(1)RxJava堆栈可读性查,一旦出现问题,堆栈信息爆炸,难以定位问题,而协程就可以避免这个问题 (2)协程用同步的方式写异步的代码,美好了生活,方便代码阅读。...(3)协程学习曲线比较平坦,相对于RxJava,协程对初学者更易于学习。

    3.8K10

    破解 Kotlin 协程(8) - Android 篇

    关键词:Kotlin 协程 Android Anko Android 上面使用协程来替代回调或者 RxJava 实际上是一件非常轻松的事儿,我们甚至可以在更大的范围内结合 UI 的生命周期做控制协程的执行状态...大家一定用过 RxJava,也一定知道用 RxJava 发了个任务,任务还没结束页面就被关闭了,如果任务迟迟不回来,页面就会被泄露;如果任务后面回来了,执行回调更新 UI 的时候也会大概率空指针。...它其实就是利用 View 的 OnAttachStateChangeListener ,当 View 被拿下的时候,我们就取消所有之前用 RxJava 发出去的请求。...合理使用调度器 在 Android 上使用协程,更多的就是简化异步逻辑的写法,使用场景更多与 RxJava 类似。...那么使用协程就更要注意这个问题了,因为协程切换线程的方式被 RxJava 更简洁,更透明,本来这是好事情,就怕被滥用。

    1.2K31

    我去你的 Kotlin 协程

    这还得从当年的 RxJava 说起。 从 RxJava 说起 LiveData 在 2017 年刚一面世,就受到了很大的关注,其中一个原因是它让很多人想到了 RxJava。...网络请求这个就不用说了,RxJava 配合 Retrofit 来做网络请求,各种复杂操作和线程切换,谁用谁知道——现在用协程就可以了,比 RxJava 方便;而 event bus,当时比较火的是两个开源库...我要说的是 Kotlin,Kotlin 在 2017 得到了 Android 官方的公开支持,在接下来这几年里,Kotlin 自身越来越完善,它的协程也越来越完善。...协程的 Flow 和 RxJava 的功能范围非常相似——其实我觉得就是一样的——但是 Flow 是协程里必不可少的一部分,而协程是 Kotlin 里必不可少的一部分,而 Kotlin 是 Android...视频(文章)开头那个问题,Yigit 的回答是:LiveData 不会被废弃,因为两个原因: 用 Java 写 Android 的人还需要它——Flow 是协程的东西,所以如果你是用 Java 的,那其实没办法用

    1K50

    即学即用Kotlin - 协程

    显然,我们不能在 Activity 中调用 GlobalScope,这样可能会造成内存泄漏,看一下如何自定义作用域,具体的步骤我在注释中已给出: class MainActivity : AppCompatActivity...launch launch 的作用从它的名称就可以看的出来,启动一个新的协程,它返回的是一个 Job对象,我们可以调用 Job#cancel() 取消这个协程。...除了 launch,还有一个方法跟它很像,就是 async,它的作用是创建一个协程,之后返回一个 Deferred对象,我们可以调用 Deferred#await()去获取返回的值,有点类似于 Java...,我们需要主动在 Activity 或者 Fragment 中的 onDestroy 方法中调用 job.cancel(),忘记处理可能是程序员经常会犯的错误,如何避免呢?...线程切换 我们学习 RxJava 的时候,大佬们都会说,RxJava 牛逼,牛逼在哪儿呢? 切换线程,同样的,Flow 的协程切换也很牛逼。

    1.6K20

    通过Rxjava看Kotlin协程(一)

    我在kotlin的协程使用过程中,其实发现了很多rxjava和协程之间很相似的地方。 如果把两个东西孤立起来学习,我觉得成本太高了。...这样我们就能把一个异步的操作,构建成一个流式的操作,对于调用方来说他们根本不关心我们内部是如何弯弯绕绕,他们只关心他们下游的流需要的后续操作就行了。...这个地方只是随手写的啊,可能会有bug的 suspendCoroutine 挂起函数 在异步编程中,回调是非常常见的写法,那么如何将回调转换为协程中的挂起函数呢?...但是吧,如果现在让我选,我还是觉得协程真香,毕竟链式调用一旦过长的情况下,其实对于开发的能力要求就越高。而kotlin协程的写法起码看起来更像是顺序执行,可读性和可维护性其实对后续来说会更好一点。...预告 下次我应该会写下关于协程的dispatcher和rxjava的Schedulers,我觉得这两个东西也还是很相似的。

    1.1K31

    Kotlin协程知识累计

    一个挂起函数只能在另个挂起函数或者协程中被调用。...6、Flow流:是冷流,就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。...从源码可知folw内是执行了挂起函数的,flow是协程中的库,只能用于协程环境。...冷流:从0到1的过程,只有调用了collect末端操作符才会去运行流,才会调用emit()发送动作;——开始消费时才生产数据,不消费则不生产 热流:从0.5到1的过程,有之前的基础,不管你用不用,创建后就已经默默去实现了...//下游接收不可以设置运行线程,保持与父协程相同运行线程 } } 7、Channel通道:从本质上来看,计算机上线程和协程同步信息其实都是通过共享内存来进行的,因为无论是哪种通信模型,线程或者协程最终都会从内存中获取数据

    29810

    RxHttp ,比Retrofit 更优雅的协程体验

    ,没有关系,那是因为你还没有找到运用场景,而网络请求正是一个很好的切入场景,本文会教你如何优雅,并且安全的开启协程,以及用协程处理多任务,用着用着你就会了。...,本文后续会一一介绍 第三步,最后,只需调用await、tryAwait、awaitResult这三个中的任一操作符获取返回值即可,这一步,需要在协程环境中才能调用 接着,如果我们要获取一个Student...亦或者说,我对协程不是很懂,你只要保证安全的前提下,告诉怎么用就行了,ok,那下面如何安全的开启一个协程,做到自动异常捕获,且页面销毁时,自动关闭协程及请求 4、协程开启及关闭 ========= 对于协程的开启...、协程串行多个请求 假设,我们有这么一种场景,首先获取Student对象,随后通过studentId获取学生的家庭成员列表,后者依赖于前者,这是典型的串行场景 看看通过协程如何解决这个问题,如下: class...,区别前者是结合RxJava下载的,后者是结合协程下载的;最后一个是解析Bitmap对象用的,asBitmap/toBitmap就是通过它去实现的 工作流程图如下: [9e3a7e82ce3d2a5b72417bc15f91b0d6

    2.3K20

    通过RxJava看kotlin协程(二)

    这篇文章主要和大家探讨下关于rxjava的Scheduler和协程的Dispatcher。 这两个东西的用处都是处理线程调度用的。...协程 Dispatcher 释义 协程上下文(coroutine context)包含一个协程调度器(参阅 CoroutineDispatcher),协程调度器 用于确定执行协程的目标载体,即运行于哪个线程...协程调度器可以将协程的执行操作限制在特定线程上,也可以将其分派到线程池中,或者让它无限制地运行。...大胆点以后面试问你kotlin协程是如何实现调度的逻辑,你就把逻辑copy一遍告诉他就好了。 感谢 写这篇文章还收收集了一些资料的,谢谢各位大佬。...理解RxJava(三)线程调度原理分析 【译】kotlin 协程官方文档(4)-协程上下文和调度器(Coroutine Context and Dispatchers)

    88351

    Google 推荐在 MVVM 架构中使用 Kotlin Flow

    ,造成内存泄露是很正常的事,大家可以从 StackOverflow 上查看一下,有很多因为 RxJava 造成内存泄露的例子 RxJava 入门的门槛很高,学习过的朋友们,我相信能够体会到从入门到放弃是什么感觉...Flow 是协程的扩展,如果要在 Room 和 Retrofit 中使用,Room 和 Retrofit 需要支持协程才可以,在 Retrofit >= 2.6.0 和 Room >= 2.1 版本都支持协程...suspend 进行了修饰,只有被 suspend 修饰的方法,才可以在协程中调用。...方法将数据提供给 Activity 或者 Fragment 方法二 在 LifeCycle 2.2.0 之后,可以用更精简的方法来完成,使用 LiveData 协程构造方法 (coroutine builder...(coroutine builder) 提供的协程代码块,产生的是一个不可变的 LiveData,处理方式 同方法一,在 Activity 或者 Fragment 中调用这个不可变的 LiveData

    5.1K21

    【翻译】忘了RxJava吧——你需要的是拥抱Kotlin协程(Part 12)

    【翻译】忘了RxJava吧——你需要的是拥抱Kotlin协程(Part 1/2) 2018-08-31 by Liuqingwen | Tags: Kotlin Android 翻译 |...在协程版本中,我们保存为 job ,然后在同一个地方调用 job.cancel() 方法。请继续关注我即将发表的文章中有关生命周期和协程的更多信息!...那么关于我们在 RxJava 代码中找到的那些缺点去哪了呢?在协程中都解决了吗? 性能开销问题 协程代码产生的对象数量下降到了 11 (下降了三分之一)。 ?...我该如何重构单元测试?...概要 好吧,在这里我们设法重构一些使用了 Singles 的代码,替换为 Kotlin 协程并从中感受到一些好处。在此系列的下一章节中,我们将考虑使用协程来处理比 RxJava 更高级的一些主题。

    1.2K20

    在 Android 开发中使用协程 | 背景介绍

    本文是介绍 Android 协程系列中的第一部分,主要会介绍协程是如何工作的,它们主要解决什么问题。 协程用来解决什么问题?...在 Android 平台上,协程主要用来解决两个问题: 处理耗时任务 (Long running tasks),这种任务常常会阻塞住主线程; 保证主线程安全 (Main-safety) ,即确保安全地从主线程调用任何...让我们来深入上述问题,看看该如何将协程运用到我们代码中。 处理耗时任务 获取网页内容或与远程 API 交互都会涉及到发送网络请求,从数据库里获取数据或者从磁盘中读取图片资源涉及到文件的读取操作。...使用协程来处理协程任务 使用协程可以简化您的代码来处理类似 fetchDocs 这样的耗时任务。我们先用协程的方法来重写上面的代码,以此来讲解协程是如何处理耗时任务,从而使代码更清晰简洁的。...用于让已暂停的协程从其暂停处继续执行。

    1.7K30

    快速进阶 Kotlin Flow:掌握异步开发技巧

    协程允许在函数执行过程中挂起,等待某些条件满足后恢复执行。Flow 利用了这一特性来实现数据流的处理。 在 Flow 内部,数据流被建模为一系列的悬挂函数调用。...Kotlin Flow 集成了 Kotlin 协程的取消机制,使得取消操作变得简单而高效。 使用协程作用域 在 Flow 中进行取消操作时,建议使用协程作用域来确保操作的一致性。...协程集成 Kotlin Flow 是 Kotlin 协程的一部分,因此它天生与 Kotlin 协程无缝集成。这意味着你可以在同一个代码块中使用协程和 Flow,实现更加一致和清晰的异步编程。...RxJava 也提供了与协程集成的方式,但与 Kotlin Flow 相比,可能需要更多的适配和配置。 冷流与热流 Kotlin Flow 支持冷流和热流的概念,这有助于惰性计算和资源优化。...两者的使用方式相似,但 Kotlin Flow 可以更加自然地与协程集成,避免了额外的配置。 背压处理 RxJava 提供了丰富的背压处理策略,例如缓存、丢弃、最新值等。

    1.5K30

    破解 Kotlin 协程(4) - 异常处理篇

    也许你已经对 RxJava 很熟悉并且感到很自然,但相比之下,RxJava 的代码比协程的复杂度更高,更让人费解,这一点我们后面的文章中也会持续用例子来说明这一点。 3....异常传播 异常传播还涉及到协程作用域的概念,例如我们启动协程的时候一直都是用的 GlobalScope,意味着这是一个独立的顶级协程作用域,此外还有 coroutineScope{...}...启动的协程体内),直接用协程启动器启动 对于明确要求子协程之间相互独立不干扰时,使用 supervisorScope 对于通过标准库 API 创建的协程,这样的协程比较底层,没有 Job、作用域等概念的支撑...$e") } } 这个从逻辑上很好理解,我们调用 await 时,期望 deferred 能够给我们提供一个合适的结果,但它因为出异常,没有办法做到这一点,因此只好给我们丢出一个异常了。...,可能会导致父协程的取消,因此调用 join 时尽管不会对协程本身的异常进行抛出,但如果 join 调用所在的协程被取消,那么它会抛出取消异常,这一点需要留意。

    1.4K10

    【Kotlin】协程(一)——入门

    介绍 这里一开始不打算介绍什么是协程,虽然标题叫介绍~~ 为了方便理解,这边先做个比喻: 从使用的角度来看,Kotlin的协程像是“另一种RxJava”,但是比RxJava要高效。...于是我决定一开始先不说什么是协程。 作用 上面说到,协程用起来“像是另一种RxJava”。 那么是不是可以用协程来开启一个异步操作?切换线程? 答案是肯定的,不仅可以做到,而且写起来也很简单。...mainScop = MainScope() 注意记得在销毁的时候调用cancel(),调用cancel()后用mainScope启动的协程都会取消掉。...withContext withContext():用给定的协程上下文调用指定的暂停块,暂停直到完成,然后返回结果。也就是说,可以用来切换线程,并返回执行后的结果。...由于Deferred#await()需要在协程中调用,所以上面在launch()中使用async()。 “这有什么用?跟launch()差不多啊?”

    1.4K20

    使用协程和 Flow 简化 API 设计

    本文将会介绍如何使用协程和 Flow 简化 API,以及如何使用 suspendCancellableCoroutine 和 callbackFlow API 创建您自己的适配器。...检查现有协程适配器 在您为现有 API 编写自己的封装之前,请检查是否已经存在针对您的用例的适配器或者 扩展方法。下面是一些包含常见类型协程适配器的库。...在 Kotlin 中,您可以简单地使用协程调用回调,但前提是您必须创建您自己的适配器。 创建您自己的适配器 如果没有找到适合您用例的适配器,更直接的做法是自己编写适配器。...suspendCancellableCoroutine 处理协程作用域的取消及从底层 API 传播取消事件。...这意味着每次调用 flow 的终端操作符时,都会执行构建块。对于我们的用例来说,由于添加一个新的位置监听器开销很小,所以这一特性不会有什么大问题。然而对于另外的一些实现可就不一定了。

    1.8K20
    领券