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

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

关键词:Kotlin 协程 协程取消 任务停止 协程的任务的取消需要靠协程内部调用的协作支持,这就类似于我们线程中断以及对中断状态的响应一样。 1. 线程的中断 我们先从大家熟悉的话题讲起。...之后再来执行后面的这段代码(也就是 log(2));而在这期间,我们在 ③ 处对刚才启动的协程触发了取消,因此在 ② 处的 delay还没有回调的时候协程就被取消了,因为 delay 可以响应取消,因此...,OkHttp 在收到我们的取消指令之后,也确实停止了网络请求,并且回调给我们一个 IO 异常,这时候我们的协程已经被取消,在处于取消状态的协程上调用 Continuation.resume 、 Continuation.resumeWithException...注意 ① 处, invokeOnCompletion 在协程进入完成状态时触发,包括异常和正常完成,那么在这时候如果发现它的状态是已经取消的,那么结果就直接调用 Call 的取消即可。...,在其中执行网络请求,那么正常来说,这时候 getUserCoroutine 返回的 Deferred 可以当做一个子协程,它应当遵循默认的作用域规则,在父作用域取消时被取消掉,但现实却并不是这样: 13

1.8K50

Kotlin 协程-暂停与取消

本次主要学习如何进行协程的取消操作以及超时后协程的处理。 取消 cancel() 我们在进行开发的过程中。往往会由于各种需求会需要控制后台协程的细粒度。比如,界面关闭了。...那么在这个界面中启动的协程已经不需要再执行了。 我们就需要触发取消事件。关闭该协程事项,回收内存。...} 主要是想告诉我们协程是可以在运行的时候进行取消。但是相关方法我们在创建定义协程的时候,需要考虑如果协程被取消该如何处理数据。...超时 withtimeOut() 在开发中,绝大多数取消一个协程的理由是它有可能超时了。...:执行事项0 协程:执行事项1 协程:执行事项2 输出:null 超时与异步 我们在超时的过程中,往往会有很多属性和方法是异步的。

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

    【Kotlin 协程】协程取消 ① ( 协程作用域取消 | 协程作用域子协程取消 | 通过抛出异常取消协程 | Job#cancel 函数 | 自定义异常取消协程 )

    协程取消 : 取消协程作用域 : 取消 协程作用域 会将该作用域中的 所有 子协程 一同取消 ; 取消子协程 : 子协程 的取消 不会影响 同一层级的 兄弟协程的执行 ; 通过抛出异常取消协程 : 协程取消通常会通过...; 然后 , 在协程作用域中 创建两个子协程 ; 最后 , 取消协程作用域 , 同时该作用域内的两个子协程也一并被取消了 ; package kim.hsl.coroutine import android.os.Bundle...:31:51.937 I job1 子协程执行完毕 10:31:51.938 I job0 子协程执行完毕 三、协程作用域子协程取消 ---- 单独取消 协程作用域 中的 子协程 , 协程作用域...delay(100) // 取消协程作用域中的子协程 job1.cancel() } } } 执行结果 : 在 协程作用域 coroutineScope...中 启动了 job0 和 job1 两个协程 , 取消了 job1 协程 , job1 协程没有执行完毕 , job0 协程执行完毕 ; 四、通过抛出异常取消协程 ---- 1、Job#cancel

    1.1K20

    kotlin--协程的启动和取消

    kotlin的协程有4中启动模式 1.DEFAULT:协程创建后,立即开始调度,在调度前如果被取消,直接进入取消响应状态 2.ATOMIC:协程创建后,立即开始调度,协程执行到第一个挂起点之前不响应取消...虽然无法直接访问这些状态,但我们可以通过访问Job的属性:isActive、isCanceled和isCompleted 8.协程的生命周期 如果协程处于活跃状态,协程运行出错或取消都会将该协程置为取消中状态...二、协程取消 1.协程的取消 1.取消作用域会取消它的子协程,CoroutineScope是创建一个全新的协程上下文,和coroutineScope作用域是不同的,作用域构建器使用的是父协程的上下文 fun...3.协程取消的资源释放 1.可以捕获取消异常,然后在finally中释放 2.use函数,该函数只能被实现了closeable的对象使用,程序结束时,会自动调用close方法,适合文件对象 4.不能取消的任务...处于取消中状态的协程不能被挂起,如果想要协程取消后,还能调用挂起函数,我们需要将清理的代码放入NoCancellable CoroutineContext中 这样会挂起运行中的代码,并保持协程的取消中状态

    1K30

    【Kotlin 协程】协程取消 ② ( CPU 密集型协程任务取消 | 使用 isActive 判定协程状态 | 使用 ensureActive 函数取消协程 | 使用 yield 函数取消协程 )

    一、CPU 密集型协程任务取消 ---- 在 协程中 , 定义在 kotlinx.coroutines 包下的 suspend 挂起函数 是可以取消的 ; 但是有一种协程任务 , CPU 密集型协程任务..., 是无法 直接取消的 ; 此类任务一直在 抢占 CPU 资源 , 使用 cancel 函数 , 无法取消该类型的 协程任务 ; 在进行 CPU 密集计算时 , 中间会有大量的中间数据 , 如果中途取消..., 大量的临时数据会丢失 , 因此在协程中 , 无法直接取消 CPU 密集型协程任务 , 这是对协程的保护措施 ; CPU 密集型协程任务取消示例 : 在下面的 协程任务 中 , 循环 10000000...:23.680 I 退出协程作用域 三、使用 ensureActive 自动处理协程退出 ---- 在协程中 , 可以执行 ensureActive() 函数 , 在该函数中会 自自动判定当前的...:23.680 I 退出协程作用域 四、使用 yield 函数检查协程状态并处理协程取消操作 ---- 在协程中 , 可以使用 yield() 函数 , 检查当前协程的状态 , 如果已经调用 cancel

    1.1K20

    协程中的取消和异常 | 取消操作详解

    在日常的开发中,我们都知道应该避免不必要的任务处理来节省设备的内存空间和电量的使用——这一原则在协程中同样适用。...有关如何执行此操作的更多信息,请参考下面的处理取消的副作用一节。 在底层实现中,子协程会通过抛出异常的方式将取消的情况通知到它的父级。父协程通过传入的取消原因来决定是否来处理该异常。...例如,如果您从磁盘中获取了多个文件,在开始读取文件内容之前,先检查协程是否被取消了。类似这样的处理方式,您可以避免处理不必要的 CPU 密集型任务。...这样会挂起运行中的代码,并保持协程的取消中状态直到任务处理完成。...现在,大家了解了本系列的第一部分 协程的一些基本概念、第二部分协程的取消,在接下来的文章中,我们将继续深入探讨学习第三部分异常处理,感兴趣的读者请继续关注我们的更新。

    2.1K20

    【Kotlin 协程】协程取消 ③ ( finally 释放协程资源 | 使用 use 函数执行 Closeable 对象释放资源操作 | 构造无法取消的协程任务 | 构造超时取消的协程任务 )

    函数构造超时取消的协程任务 一、释放协程资源 ---- 如果 协程中途取消 , 期间需要 释放协程占有的资源 ; 如果执行的协程任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用...try…catch…finally 代码块 , 在 finally 代码块中的代码 , 即使是协程取消时 , 也会执行 ; 代码示例 : package kim.hsl.coroutine import...") } } } 执行结果 : 即使是取消协程任务后 , 在协程抛出 JobCancellationException 异常后 , finally 中的代码在最后也被执行了 ;...(1000) Log.i(TAG, "释放协程占用的资源完毕") } } 如果在协程取消后 , finally 代码块的代码肯定会执行 , 但是如果 finally 中 delay...挂起函数以及之后的代码将不会被执行 ; 使用 withContext(NonCancellable) {} 代码块 , 可以构造一个无法取消的协程任务 , 这样可以避免 finally 中的代码无法完全执行

    1.4K10

    【Kotlin 协程】协程启动 ⑥ ( 协程生命周期状态 | 新创建 New | 活跃 Active | 完成中 Completing | 已完成 Completed | 取消中 | 已取消 )

    会返回 Job 类型实例对象 , 该 Job 对象是 协程的 唯一标识 , 借助该对象可以实现 对 协程 生命周期 的管理 ; 二、协程生命周期状态 ---- 协程 生命周期状态 : 新创建 New...获取当前是否处于 已完成状态 ; 取消中 Canceling 已取消 Cancelled : 通过调用 Job#isCancelled 获取当前是否处于 取消状态 ; 之前的博客 【Kotlin 协程...】协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 ) 中 , 提到的 取消 协程 后...协程构建器 函数 创建 协程 时 状态为 新创建 New 状态 ; 协程 调度执行 后 会变成 活跃 Active 状态 ; 处于活跃状态的协程 有两个分支 , 分别是 协程完成 和 协程取消 :...; 协程取消分支 : 调用 Job#cancel() 函数 取消协程 , 会进入到 取消中 Canceling 状态 , 此时不会立刻取消 , 因为该协程中可能还有多个子协程 , 需要等待 所有子协程都取消后

    64910

    【Kotlin 协程】Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集协程 | 通过取消流收集所在的协程取消流 )

    文章目录 一、调用 Flow#launchIn 函数指定流收集协程 1、指定流收集协程 2、Flow#launchIn 函数原型 3、代码示例 二、通过取消流收集所在的协程取消流 一、调用 Flow...【Kotlin 协程】Flow 异步流 ⑤ 中 , 调用 Flow#flowOn 函数 , 可以 指定 Flow 流发射元素 的 协程 ; Flow#launchIn 函数返回值是 Job 对象 ,...是 协程任务对象 , 可调用 Job#cancel 函数取消该协程任务 ; 2、Flow#launchIn 函数原型 Flow#launchIn 函数原型 : /** * 终端流操作符,在[作用域]中...---- Flow 流的 收集元素 操作 , 是在协程中执行 , 将 协程 取消 , 即可将 Flow 流收集操作 取消 , 也就是 将 Flow 流取消 ; 代码示例 : 使用 withTimeoutOrNull...(2000) 创建一个协程 , 该协程在 2000ms 后自动超时取消 , 同时在其中进行 流收集 的操作也一并取消 ; package kim.hsl.coroutine import android.os.Bundle

    85920

    Kotlin协程的取消机制:深入理解和优雅实现

    Kotlin协程提供了一种高效的方式来处理并发和异步任务。在协程的生命周期管理中,取消协程是一项重要的操作。...本文将深入探讨Kotlin协程的取消机制,介绍除了直接使用Job的cancel方法之外的其他方式,并提供优雅的实现策略。 1. 协程取消的基本概念 在Kotlin协程中,取消协程是一个协作过程。...当外部请求取消协程时,协程需要定期检查自己的取消状态,并在适当的时候退出。这种设计允许协程在取消时进行清理工作,比如关闭资源、保存状态等。...2.5 使用CoroutineScope的取消 如果你在CoroutineScope中启动协程,你可以通过取消整个CoroutineScope来间接取消所有在其中启动的协程。...通过本文的介绍,你应该对Kotlin协程中的取消机制有了更深入的理解。在实际开发中,合理地使用这些机制,可以大大提高代码的健壮性和可维护性。

    13310

    协程中的取消和异常 | 异常处理详解

    ⚠️ 为了能够更好地理解本文所讲的内容,建议您首先阅读本系列中的第一篇文章: 协程中的取消和异常 | 核心概念介绍。 某个协程突然运行失败怎么办?...△ 协程中的异常会通过协程的层级不断传播 虽然在一些情况下这种传播逻辑十分合理,但换一种情况您可能就不这么想了。...如果它的子协程抛出了一个异常,就会导致 UI 作用域 (UI scope) 被取消,并且由于被取消的作用域无法开启新的协程,所有的 UI 组件都会变得无法响应。...处理异常‍ 协程使用一般的 Kotlin 语法处理异常: try/catch 或内建的工具方法,比如 runCatching (其内部还是使用了 try/catch) 前面讲到,所有未捕获的异常一定会被抛出...⚠️ 在 coroutineScope builder 或在其他协程创建的协程中抛出的异常不会被 try/catch 捕获!

    1.1K20

    协程中的取消和异常 | 核心概念介绍

    在之前的文章里,我们为各位开发者分享了在 Android 中使用协程的一些基础知识,包括在 Android 协程的背景介绍、上手指南和代码实战。...本次系列文章 "协程中的取消和异常" 也是 Android 协程相关的内容,我们将与大家深入探讨协程中关于取消操作和异常处理的知识点和技巧。...)、取消中 (Cancelling) 和已取消 (Cancelled)。...△ Job 的生命周期 如果协程处于活跃状态,协程运行出错或者调用 job.cancel() 都会将当前任务置为取消中 (Cancelling) 状态 (isActive = false, isCancelled...现在,大家了解了协程的一些基本概念,在接下来的文章中,我们将在第二篇继续深入探讨协程的取消、第三篇探讨协程的异常处理。

    1K10

    协程中的取消和异常 | 驻留任务详解

    在本系列第二篇文章 协程中的取消和异常 | 取消操作详解 中,我们学到,当一个任务不再被需要时,正确地退出十分的重要。...协程的最佳实践 由于本文所介绍的模式是在协程的其它最佳实践的基础之上实现的,我们可以借此机会回顾一下: 1. 将调度器注入到类中 不要在创建协程或调用 withContext 时硬编码调度器。...如果您认为这条最佳实践在您的工程中不可行,则很有可能是您没有遵循第一条最佳实践 (测试没有注入调度器的 ViewModel 会变得更加困难;这种情况下,暴露出挂起函数会使测试变得可行)。...applicationScope 必须包含一个 SupervisorJob(),这样协程中的故障便不会在层级间传播 (见本系列第三篇文章: 协程中的取消和异常 | 异常处理详解): class MyApplication...❌ ✅ 使用 NonCancellable 正如您在本系列第二篇文章 协程中的取消和异常 | 取消操作详解 中看到的,您可以使用 withContext(NonCancellable) 在被取消的协程中调用挂起函数

    1.5K20

    Go语言通知协程退出(取消)的几种方式

    在 Go 语言中,控制goroutine的退出或取消很重要,这能使资源得到合理利用,避免潜在的内存泄露。...如下是一些在 Go 中通知协程退出的常见方式: 使用通道(Channel):通过发送特定的信号或关闭通道来通知协程退出。这是最简单直接的方法。...**使用 sync.WaitGroup**:虽然 WaitGroup 本身不用于发送取消信号,但它可以用来等待一组协程完成,通常与其他方法(如通道)结合使用来控制协程的退出。 1....在线代码[2] 在上面这两个示例中,当主函数完成其工作后,通过通道发送信号或调用 cancel 函数来通知协程退出。...使用 sync.WaitGroup 控制协程退出 sync.WaitGroup 主要用于等待一组协程的完成。其不直接提供通知协程退出的机制,但可以与其他方法(如通道)结合使用来控制协程的退出。

    78010

    【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )

    中 , 如果 Activity 被销毁 , 则 在 onDestory 生命周期函数中取消协程任务 ; viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel...是一个 函数 , 其返回值类型为 CoroutineScope 协程作用域 ; 这是使用了设计模式中的 工厂模式 , 生产一个 协程作用域 实例对象 ; 之后的 协程操作都要定义在该协程作用域中 ;...消该 协程作用域 , 同时 该协程作用域内的协程任务不管是否执行完毕 都一并取消 , 该函数是 CoroutineScope 的扩展函数 ; /** * 取消这个范围,包括它的作业和它的所有子任务...启动的协程任务 , 如果取消 mainScope 协程作用域 , 则在该 协程作用域 中执行的 协程任务 , 都会被取消 ; 挂起函数中途被取消 会抛出 JobCancellationException...CoroutineScope 的 launch 扩展函数 launch { // 协程作用域, 在该代码块中执行协程任务 // Dispatchers.IO

    1.3K11

    Kotlin中的协程及在Android中的应用

    前言 Kotlin协程底层是用线程实现的,是一个封装完善供开发者使用的线程框架。...Kotlin的一个协程可以理解为是运行在线程上的一个执行任务并且该任务可以在不同的线程间切换,一个线程可以同时运行多个协程。...(Dispatchers.IO){ } 这两种方式都是在指定的 IO 调度器中启动一个协程,但它们之间有一些区别: GlobalScope.launch(Dispatchers.IO){} 是在全局范围内启动一个协程...CoroutineScope(Dispatchers.IO).launch {} 是在指定的 CoroutineScope 中启动一个协程,通常情况下应该手动创建 CoroutineScope 对象,并确保在合适的时机取消该...最常见的,网络请求在IO线程,而页面更新在主线程。 Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。

    19010

    java协程框架quasar和kotlin中的协程

    协程不同于线程,线程是操作系统级别的资源,创建线程,调度线程,销毁线程都是重量级别的操作。而且线程的资源有限,在java中大量的不加限制的创建线程非常容易将系统搞垮。...接下来要分享的这个开源项目,正是解决了在java中只能使用多线程模型开发高并发应用的窘境,使得java也能像Go语言那样使用协程的语义开发了。...上面的场景在设置200个固定大小线程池时。结果也是可预见的达到了50多秒。这个结果足以证明协程编程ko线程编程了。...而反观协程,基于固定的几个线程调度,可以轻松实现百万级的协程处理,而且内存稳稳的。 后记 最后,博主以为Quasar只是一个框架层面的东西,所以就又去看了下同样是jvm语言的kotlin的协程。...,有种震惊的赶脚,kotlin的同步模型牛逼呀,瞬时感觉到发现了java里的骚操作了,可以使用kotlin的协程来代替java中的多线程操作。

    54430

    Kotlin协程-特殊的阻塞协程

    阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。...这里给出结果,改用GlobalScope.launch之后,子协程会在一个独立的线程里运行。 runBlocking 在kotlin协程官网上对于这个api的解释是桥接阻塞与非阻塞的世界。...但实际情况跟注释有点不同,如果在 runBlocking 中开一个 GlobalScope.launch,并且在里面延时很久,那么外面的线程其实是不会等待 GlobalScope 里的协程完成的。...在创建完coroutine后就进入派发流程了,这部分和Kotlin协程-一个协程的生命周期中的逻辑比较相似,下面也会讲到。...这个问说明,runBLocking{}这种协程,它的运行逻辑是先把父协程放队列里,然后取出来执行,执行完毕再把子协程入队,再出队子协程,用同样的方式递归。

    2.5K20

    揭秘kotlin协程中的CoroutineContext

    前言 -- 从kotlin1.1开始,协程就被添加到kotlin中作为实验性功能,直到kotlin1.3,协程在kotlin中的api已经基本稳定下来了,现在kotlin已经发布到了1.4,为协程添加了更多的功能并进一步完善了它...,所以我们现在在kotlin代码中可以放心的引入kotlin协程并使用它,其实协程并不是kotlin独有的功能,它是一个广泛的概念,协作式多任务的实现,除了kotlin外,很多语言如Go、Python等都通过自己的方式实现了协程...,不同语言的调度的实现不一样,在kotlin中,通过Dispatcher来调度协程,而Dispatcher它通常是一个线程池的实现或者基于特定平台(例如Android)主线程的实现,通过调度让协程运行于一个或多个线程之中...(Cancelling)状态, 处于取消中状态的协程会等所有子协程都完成后才进入取消 (Cancelled)状态,当协程执行完成后或者调用CompletableJob(CompletableJob是Job...在kotlin中每个协程都有一个Continuation实例与之对应,当协程恢复时会调用Continuation的resumeWith方法,它的实现在DispatchedContinuation中,如下

    1.9K31
    领券