首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin协程解析系列(上):协程调度与挂起

Kotlin协程实现层次: 基础设施层:标准库的协程API,主要对协程提供了概念和语义上最基本的支持; 业务框架层:协程的上层框架支持,基于标准库实现的封装,也是我们日常开发使用的协程扩展库。...图片 二、协程启动 具体在使用协程前,首先要配置对Kotlin协程的依赖。...确保所有的协程都会被追踪,Kotlin 不允许在没有使用CoroutineScope的情况下启动新的协程。...对于 ATOMIC 模式,它一定会被启动,实际上在遇到第一个挂起点之前,它的执行是不会停止的,而 delay 是一个 suspend 函数,这时我们的协程迎来了自己的第一个挂起点,恰好 delay 是支持...5.2 suspend本质 Kotlin 使用堆栈帧来管理要运行哪个函数以及所有局部变量。 协程在常规函数基础上添加了suspend和resume两项操作用于处理长时间运行的任务。

2K40

破解 Kotlin 协程(5) - 协程取消篇

关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...,我们没有用 suspend main,而是直接用 runBlocking 启动协程,这个方法在 Native 上也存在,都是基于当前线程启动一个类似于 Android 的 Looper 的死循环,或者叫消息队列...之后再来执行后面的这段代码(也就是 log(2));而在这期间,我们在 ③ 处对刚才启动的协程触发了取消,因此在 ② 处的 delay还没有回调的时候协程就被取消了,因为 delay 可以响应取消,因此...,它的构造可接受一个 Job 实例作为它的父协程,那么问题来了,这里并没有告诉它父协程究竟是谁,因此也就谈不上作用域的事儿了,这好像我们用 GlobalScope.launch 启动了一个协程一样。...Continuation 实例,这实际上就相当于要继承当前协程的上下文,因此我们只需要在真正需要切换协程的时候再去做这个转换即可: public suspend fun Call<

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

    从 LiveData 迁移到 Kotlin 数据流

    #2: 把一次性操作的结果暴露出来 这个例子与上面代码片段的效果一致,只是这里暴露协程调用的结果而无需使用可变属性。...Activity 和 Fragment 提供了若干协程构建器: Activity.lifecycleScope.launch : 立即启动协程,并且在本 Activity 销毁时结束协程。...Fragment.lifecycleScope.launch : 立即启动协程,并且在本 Fragment 销毁时结束协程。...Fragment.viewLifecycleOwner.lifecycleScope.launch : 立即启动协程,并且在本 Fragment 中的视图生命周期结束时取消协程。...lifecycle.repeatOnLifecycle 前来救场 这个新的协程构建器 (自 lifecycle-runtime-ktx 2.4.0-alpha01 后可用) 恰好能满足我们的需要: 在某个特定的状态满足时启动协程

    1.4K20

    Android入门教程 | Fragment 基础概念

    可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且可以在 Activity 运行时添加或移除片段(这有点像可以在不同 Activity 中重复使用的“子...savedInstanceState 参数是在恢复片段时,提供上一片段实例相关数据的 Bundle(处理片段生命周期部分对恢复状态做了详细阐述)。...android:name 属性指定要在布局中进行实例化的 Fragment 类。...创建此 Activity 布局时,系统会将布局中指定的每个片段实例化,并为每个片段调用 onCreateView() 方法,以检索每个片段的布局。...这样就能做到多个 Fragment 切换不重新实例化: 2. Fragment 的的优点 Fragment 可以使你能够将 activity 分离成多个可重用的组件,每个都有它自己的生命周期和UI。

    3.5K40

    关于 Kotlin Coroutines, 你可能会犯的 7 个错误

    但是,我发现了许多开发者在使用协程时会犯一些通用性的错误。 1. 在使用协程时实例化一个新的 Job 实例 有时候你会需要一个 job 来对协程进行一些操作,例如,稍后取消。...通过向协程构建器 launch() 传递我们自己的 job 实例,实际上并没有把新的 job 实例和协程本身进行绑定,取而代之的是,它成为了新协程的父 job。...我们打破了结构化并发,因此当我们取消协程作用域时,协程将不再被取消。 解决方式是直接使用 launch() 返回的 job。...错误的使用 SupervisorJob 有时候你会使用 SupervisorJob 来达到下面的效果: 在 job 继承体系中停止异常向上传播 当一个协程失败时不影响其他的同级协程 由于协程构建器 launch...在子协程中使用 CoroutineExceptionHandler 再来一条简明扼要的:在子协程的构建器中使用 CoroutineExceptionHandler 不会有任何效果。

    99820

    揭秘kotlin协程中的CoroutineContext

    前言 -- 从kotlin1.1开始,协程就被添加到kotlin中作为实验性功能,直到kotlin1.3,协程在kotlin中的api已经基本稳定下来了,现在kotlin已经发布到了1.4,为协程添加了更多的功能并进一步完善了它...,所以我们现在在kotlin代码中可以放心的引入kotlin协程并使用它,其实协程并不是kotlin独有的功能,它是一个广泛的概念,协作式多任务的实现,除了kotlin外,很多语言如Go、Python等都通过自己的方式实现了协程...,这些协程可以在同一线程的不同时刻被执行,也可以在不同线程上的不同时刻被执行。...,例如启动一个协程1,在协程中继续启动协程2、协程3,那么协程1就是协程2、协程3的父协程,协程2、协程3就是协程1的子协程,每个协程都会有一个对应的Job,协程之间的父子关系是通过Job对象维持的,像一颗树一样...在kotlin中每个协程都有一个Continuation实例与之对应,当协程恢复时会调用Continuation的resumeWith方法,它的实现在DispatchedContinuation中,如下

    1.9K31

    使用Kotlin实现动态代理池的多线程爬虫

    与传统的线程相比,协程的开销更小,更适合处理高并发的网络请求。 (三)技术选型 Kotlin:一种运行在JVM上的现代编程语言,以其简洁的语法和强大的功能受到开发者的青睐。...三、实现多线程爬虫 (一)Kotlin协程简介 Kotlin协程是一种轻量级的并发机制,适用于处理高并发的网络请求。与传统的线程相比,协程的开销更小,能够显著提高程序的性能。...(二)爬虫的多线程实现 我们将使用Kotlin协程来实现多线程爬虫。协程通过launch函数启动,并可以使用async函数实现异步操作。...协程启动:使用CoroutineScope启动多个协程任务,每个任务负责爬取一个页面。 页面请求:在fetchPage函数中,使用OkHttp发送请求并获取页面内容。...协程调度:合理配置协程的调度策略,避免过多协程同时运行导致资源耗尽。 错误处理:在网络请求中添加错误处理逻辑,避免因单个请求失败导致整个爬虫停止。

    7710

    再谈协程之CoroutineContext我能玩一年

    (Dispatchers.Main, “name”) + (Dispatchers.IO) = (Dispatchers.IO, “name”) ❝要注意的是,一个新的协程上下文,除了继承父协程的上下文之外...在作用域的上下文中定义元素,是在使用上下文的地方,覆盖库的默认值的一种方式。该作用域还提供了一个job,因此从该作用域启动的所有coroutine都有同一个父级。...然而,由于协程的结构化并发,如果不能被取消,deferred可能会导致内存泄露。所以,确保CompletableDeferred被正确取消的最简单的方法是将它与它的parent job绑定。...如果我们愿意,我们实际上可以从单个元素重建一个与当前上下文相同的协程上下文。...通过使用简单的 + 运算符组合上下文,语言设计者可以在启动协程时轻松定义协程的属性,并从执行上下文继承这些属性。这使开发人员可以完全控制他们的协程,同时保持语法流畅。

    77810

    Kotlin协程实现原理:CoroutineScope&Job

    今天我们来聊聊Kotlin的协程Coroutine。 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine?...例如,在Android中使用协程来请求数据,当接口还没有请求完成时Activity就已经退出了,这时如果不停止正在运行的协程将会造成不可预期的后果。...所以在Activity中我们都推荐使用lifecycleScope来启动协程,lifecycleScope可以让协程具有与Activity一样的生命周期意识。...Job 基本上每启动一个协程就会产生对应的Job,例如 lifecycleScope.launch { } launch返回的就是一个Job,它可以用来管理协程,一个Job中可以关联多个子Job,同时它也提供了通过外部传入...项目 android_startup: https://github.com/idisfkj/android-startup 提供一种在应用启动时能够更加简单、高效的方式来初始化组件,优化启动速度。

    1.6K40

    Kotlin 新版来了,支持跨平台!

    我们来回顾下 1.3的 新特性 稳定的协程 Kotlin/Native Beta 多平台项目和工具 用于 Kotlin/Native 和多平台的工具 Ktor 1.0 Beta 本次版本带来的牛逼特性主要对...不过这样就涉及到了性能问题,因为在 UIntArray 被当作 Collection的实例使用时会额外 创建 一个对象出来。...除 IntelliJ IDEA 之外,我们也将发布 Kotlin/Native 插件支持 CLion 2019.1、AppCode 2019.1。...IntelliJ IDEA 支持 调试功能的提升 当你在调试协程代码时,你可以看到有一个单独的异步堆栈 “Async stack trace” 显示挂起时的变量。...你可以浏览 suspend 函数在当前协程中从上一个挂起点的全部的堆栈 (第12、4行)并确认变量的值: 这会帮助你更方便的理解当前协程的运行状态。

    1.2K20

    破解 Kotlin 协程(2) - 协程启动篇

    本文将为大家详细介绍协程的几种启动模式之间的不同,当然,我不打算现在就开始深入源码剖析原理,大家只需要记住这些规则就能很好的使用协程了。 1....但在开始运行之前无法取消 UNDISPATCHED 立即在当前线程执行协程体,直到第一个 suspend 调用 LAZY 只有在需要的情况下运行 2.1 DEFAULT 四个启动模式当中我们最常用的其实是...就是需要它的运行结果的时候, launch 调用后会返回一个 Job 实例,对于这种情况,我们可以: 调用 Job.start,主动触发协程的调度执行 调用 Job.join,隐式的触发协程的调度执行...对于 ATOMIC 模式,我们已经讨论过它一定会被启动,实际上在遇到第一个挂起点之前,它的执行是不会停止的,而 delay 是一个 suspend 函数,这时我们的协程迎来了自己的第一个挂起点,恰好 delay...我们使用线程的时候,想要让线程里面的任务停止执行也会面临类似的问题,但遗憾的是线程中看上去与 cancel 相近的 stop 接口已经被废弃,因为存在一些安全的问题。

    1K30

    【翻译】深入 Kotlin 协程

    在 UI 线程上启动一个网络请求是不明智的做法(在安卓上这甚至不可能,因为你的应用程序会抛出一个丑陋的 NetworkOnMainThreadException 异常),由于网络请求经常会花费至少半秒的时长...,而这个函数自己则返回一个 Job 实例,它可以在其他的协程中使用并被控制执行。...在 C# 中 async 和 await 都是关键字 在 C# 中 async 函数只能返回一个 Task 实例或者返回空 如果你仔细观察协程的这个例子,你会看到在 Kotlin 中, launch{}...这在命名和返回值类型方面给开发者手头留了一个最灵活的工具。 线程 vs 协程 唤醒一个线程需要巨大的资源开销。在一个现代化系统上,一个线程非常容易就能吃掉 1M 多的内存。...通过使用 CoroutineStart.LAZY 这个值,可以让协程只在开发者显式调用返回的 Deferred 实例或者 Job 实例的 await() 方法或者 join() 方法才开始运行。

    1.5K10

    Android开发3年,九月份面试12家大厂跳槽成功,我有一些面试经验想分享给你们

    kotlin ?的原理 在项目中有直接使用tcp,socket来发送消息吗 如何在网络框架里直接避免内存泄漏,不需要在presenter中释放订阅 生命周期都是通过什么调用的?有用过AIDL吗?...kotlin lazy使用,lazy viewmodel 有没有看一下Google官方的ViewModel demo ViewModel在Activity初始化与在Fragment中初始化,有什么区别?...说说App的启动过程,在ActivityThread的main方法里面做了什么事,什么时候启动第一个Activity?...动画连续调用的原理是什么? 做过一些SDK的操作吗? 协程可以在Java项目中使用吗? SharedPreference原理?读取xml是在哪个线程? 了解APK打包的过程吗? class文件的组成?...协程介绍一下,讲一个协程的scope与context,协程的+号代表什么 Handler休眠是怎样的?epoll的原理是什么?如何实现延时消息,如果移除一个延时消息会解除休眠吗?

    1.6K10

    破解 Kotlin 协程 番外篇(2) - 协程的几类常见的实现

    Kotlin 的协程是一种无栈协程的实现,它的控制流转依靠对协程体本身编译生成的状态机的状态流转来实现,变量保存也是通过闭包语法来实现的,不过 Kotlin 的协程可以在任意调用层次挂起,换句话说我们启动一个...coroutine.yield:挂起协程,第一个参数为被挂起的协程实例,后面的参数则作为外部调用 resume 来继续当前协程时的返回值,而它的返回值则又是外部下一次 resume 调用时传入的参数。...coroutine.resume:继续协程,第一个参数为被继续的协程实例,后面的参数则作为协程内部 yield 时的返回值,返回值则为协程内部下一次 yield 时传出的参数;如果是第一次对该协程实例执行...,它包括: 协程的执行体,主要是指启动协程时对应的函数 协程的控制实例,我们可以通过协程创建时返回的实例控制协程的调用流转 协程的状态,在调用流程转移前后,协程的状态会发生相应的变化 说明 Lua 标准库的协程属于非对称有栈协程...相比之下,有朋友抱怨 Kotlin 的协程没有其他语言的 async/await 那么容易上手,也没有 go routine 那么容易使用,原因也很简单,Kotlin 的协程用一个最基本的 suspend

    1.5K31

    是时候使用Kotlin编程了

    例如: 当然,也可以直接在声明类的时候指定构造函数,对象实例化可以不写new关键字。...例如: 4,协程 协程(coroutine),又称微线程,是一种无优先级的子程序调度组件,由协程构建器(launch coroutine builder)启动。...协程本质上是一种用户态的轻量级线程,协程的调用方式与子线程的调用方式一样,但是协程的使用更加方便灵活,但使用上协程并没有子线程那样广泛。...以下是协程使用的实例: ,关于协程更多的内容可以访问下面的链接: https://www.kotlincn.net/docs/tutorials/coroutines-basic-jvm.html...12.1 协程简介 12.1.1 协程与线程 12.1.2 使用协程的好处 12.2 协程开发环境 12.2.1 Gradle构建方式 12.2.2 Maven构建方式 12.3 协程基础 12.3.1

    3.3K10

    你真的懂协程 (Coroutine) 吗 ? Kotlin Coroutines — Suspending Functions

    协程是什么协程并不是一个新的概念,它并不是 Kotlin 发明的。它们已经存在了几十年,并且在 Go 等其他一些编程语言中很受欢迎。...本文主要讲协程在 Kotlin 中实现的方式。事实上,在 Kotlin 中除了 suspend 关键字,没有任何其他关键字被添加到语言中。...Kotlin 编写异步代码: suspend 函数 Kotlin 编写异步代码的方式是使用协程,这是一种计算可被挂起的想法。即一种函数可以在某个时刻暂停执行并稍后恢复的想法。...编写这段代码代码就好像我们正在编写同步代码,自上而下,不需要任何特殊语法,除了使用一个名为 launch 的函数,它实质上启动了该协程(在其他教程中介绍)。 编程模型和 API 保持不变。...编译器负责将其适应每个平台。 Kotlin 中协程的实现原理 Kotlin 协程本质上是依托线程执行的。

    1.5K30
    领券