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

Kotlin -暂停与取消

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

57630

破解 Kotlin (5) - 取消

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

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

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

74820

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 这样会挂起运行代码,并保持取消状态

92530

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

96520

取消和异常 | 取消操作详解

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

2K20

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.2K10

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

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

61610

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

70420

取消和异常 | 异常处理详解

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

1K20

取消和异常 | 核心概念介绍

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

96110

取消和异常 | 驻留任务详解

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

1.4K20

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

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

21910

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

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

1K10

KotlinAndroid应用

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

9010

java框架quasar和kotlin

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

28730

Kotlin-特殊阻塞

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

2.3K20

揭秘kotlinCoroutineContext

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

1.7K30

Kotlin-内部概念Continuation

| RUNNING |------------------->| COMPLETED |                +------------+          +-----------+ 而重点是可以挂起和运行两个状态中切换...实现这个能力关键在于实现了continuation接口。...launch{}源码里可以看到有个block参数,这个block就是我们所写代码, public fun CoroutineScope.launch( context: CoroutineContext...从源码里猜测,它肯定是一个实现了continuation类,因此它才能有可重入性。...所以会看到虽然外部概念很清晰,只是一个 coroutine,但在内部,实际上支撑它还有Continuation,Dispatch,Intercept。还是挺复杂

1.6K40
领券