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

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

协程中 , 定义在 kotlinx.coroutines 包下的 suspend 挂起函数 是可以取消的 ; 但是有一种协程任务 , CPU 密集型协程任务 , 是无法 直接取消的 ; 此类任务一直在...抢占 CPU 资源 , 使用 cancel 函数 , 无法取消该类型的 协程任务 ; 在进行 CPU 密集计算时 , 中间会有大量的中间数据 , 如果中途取消 , 大量的临时数据会丢失 , 因此在协程中..., 当调用 Job#cancel 函数取消协程时 , 当前的任务会变为 取消中 Cancelling 状态 , 取消中 Cancelling 状态 通过 ( isActive == false && isCancelled...* * 这个方法可以替代以下代码,但有更精确的例外: * ``` * if (!..., 将执行权让给别的协程执行 ; yield() 函数 会在每次循环时 , 都执行一次 , 每次循环时都执行该函数的时候 , 此时会尝试出让线程的执行权 , 看看是否有其它更紧急的协程需要执行 , 如果有

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

    Kotlin 高阶语法解析

    协程(Coroutines)协程是 Kotlin 处理异步编程和并发的利器,它允许你以同步的代码风格编写异步逻辑,避免了回调地狱1.1 基础概念1.挂起和恢复 暂停当前协程的执行,并释放它占用的线程资源...Android 中的生命周期感知作用域: viewModelScope (在 ViewModel 中使用) lifecycleScope (在 Activity/Fragment 中使用) 4.调度器决定协程在哪个或哪些线程上执行...ViewModel 中 class MyViewModel : ViewModel() { // 使用 viewModelScope,当 ViewModel 被清除时自动取消所有协程...密封类(Sealed Classes)密封类用于表示受限的类继承结构,当一个值只能是有限几种类型之一时非常有用,常与 when 表达式结合使用,确保穷举检查。...函数对象引用返回值适用场景letitlambda结果对象为空时跳过操作runthislambda结果需要计算多个属性时withthislambda结果配置对象参数applythis对象自身对象初始化配置

    14510

    Kotlin 高阶语法解析

    协程(Coroutines) 协程是 Kotlin 处理异步编程和并发的利器,它允许你以同步的代码风格编写异步逻辑,避免了回调地狱 1.1 基础概念 1.挂起和恢复 暂停当前协程的执行,并释放它占用的线程资源...Android 中的生命周期感知作用域: viewModelScope (在 ViewModel 中使用) lifecycleScope (在 Activity/Fragment 中使用) 4....loadData() = withContext(Dispatchers.IO) { // 网络请求 } 1.3 实战示例 Android 中的典型用法 // 在 ViewModel 中 class...MyViewModel : ViewModel() { // 使用 viewModelScope,当 ViewModel 被清除时自动取消所有协程 fun loadUserData(...函数 对象引用 返回值 适用场景 let it lambda结果 对象为空时跳过操作 run this lambda结果 需要计算多个属性时 with this lambda结果 配置对象参数 apply

    14010

    Android协程的7个必要知识点

    协程在UI线程中的使用: 学会在Android应用中使用协程来处理UI操作,避免阻塞主线程。 协程基础 Kotlin Coroutine是一种轻量级的并发编程库,使异步编程变得更加简单和可控。...协程的工作原理 协程的核心是通过调度器(Dispatcher)在不同的线程上执行任务。当协程遇到挂起函数时,它会挂起当前线程,然后将任务切换到其他线程上执行,等待异步操作完成后再继续执行。...另外,当协程的父协程被取消时,所有的子协程也会被取消。...通道(Channel)的基本概念 通道是一种线程安全的数据结构,允许协程在一个端发送数据,而在另一个端接收数据。通道的数据传输是非阻塞的,这意味着发送和接收操作可以在没有数据时暂停,直到数据准备好。...在Android应用中使用协程处理UI操作 在Android应用中,保持主线程的响应性是至关重要的。Kotlin Coroutine为我们提供了一种优雅的方式来处理异步操作,同时避免阻塞主线程。

    1.7K52

    【Kotlin 协程】协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

    在本例中没有选择子句。 * * 这个选择函数是_biased_到第一个子句。当可以同时选择多个子句时, * 第一个有优先权。...如果作业被取消,而此函数被取消 * 暂停,将无法成功恢复。参见[suspendCancellableCoroutine]文档了解底层细节。 * * 注意,该函数在未挂起时不会检查是否取消。...主要是在 select 代码块中实现 , 能够在 select 中执行的多路复用事件 , 称为 SelectClauseN 事件 : SelectClause0 事件 : 没有返回值 , 没有参数 ;...[select]表达式,该表达式在指定元素时进行选择 * 当参数被发送到通道时。...子句被选中时,对该通道的引用 * 传递到相应的块中。

    1.5K20

    Kotlin 协程 通道 Channel 介绍

    var x = 1 while (true) send(x++) // 在流中开始从 1 生产无穷多个整数 } fun main() = runBlocking { val squares...通道缓冲 在上面的示例中,所有的通道都是没有缓冲区的。而无缓冲的Channel在发送者和接收者相遇时传输元素(简称:对接)。如果发送先被调用,那么通道会挂起等待通道中的消息被接收。...当发送者想发射第五个元素的时候,将会被挂起。直到被接收。 8. 通道公平性 在Channel之中,发送和接收操作是公平的。并且尊重调用它们的多个协程。...} //输出 初始化元素,并开始使用: kotlin.Unit 下一个元素在50毫秒内准备就绪: null 下一个元素在100毫秒内准备就绪: kotlin.Unit 消费者暂停150毫秒 下一个元素在消费者暂停延迟后立即使用...: kotlin.Unit 消耗元素在停止150毫秒后,下一个元素在50毫秒内准备就绪: kotlin.Unit ticker 知道可能的消费者暂停,并且默认情况下会调整下一个生成的元素如果发生暂停则延迟

    80510

    【Kotlin 协程】协程并发安全问题 ( 使用 Atomic 并发安全类型 | 使用 Channel 通道 | 使用 Mutext 轻量级锁 | 使用 Semaphore 轻量级信号量 )

    协程不安全数据访问 二、使用 Atomic 并发安全类型 三、使用 Channel 通道 四、使用 Mutext 轻量级锁 五、使用 Semaphore 轻量级信号量 一、协程不安全数据访问 ---- 在多个线程中...同时访问 相同数据 , 就会出现 线程不安全 访问 的问题 ; 如果多个协程中 , 同时访问相同数据 , 同样会出现 不安全数据访问 问题 ; 协程不安全数据访问代码示例 : 同时开启 100000...如果执行时获取不到 Mutext 锁 , 会挂起等待 Mutext 锁释放 , 不会阻塞线程 ; 首先 , 创建 Mutex 锁 实例对象 ; val mutex = Mutex() 然后 , 将协程中的并发代码定义在...kim.hsl.coroutine I 100000 五、使用 Semaphore 轻量级信号量 ---- 使用 Semaphore 轻量级信号量 , 可以同时定义多个 信号量 , 协程获取到 对应 信号量时才能执行并发任务...; 首先 , 创建 Semaphore 信号量 实例对象 ; val semaphore = Semaphore(1) 然后 , 将协程中的并发代码定义在 semaphore.withPermit 代码块内

    90220

    你不知道的CoroutineContext:协程上下文大揭秘!

    前言 协程(Coroutine)是一种并发编程技术,它允许我们在一个线程中执行多个任务,而不需要创建多个线程。协程与线程的区别在于,线程是操作系统的概念,而协程是编程语言的概念。...协程可以暂停和恢复执行,而线程只能被终止。 在 Android 中,协程由 Kotlin 语言支持。Kotlin 协程库提供了丰富的 API,可以帮助我们轻松地编写并发代码。...fun main() = runBlocking { val context = coroutineContext + Dispatchers.Main val dispatcher...CoroutineContext的注意事项 在使用CoroutineContext时,需要注意以下几点: 合理选择调度器:根据任务的性质选择合适的调度器,避免在IO密集型任务中使用CPU密集型的调度器,...异常处理:及时处理协程中的异常,可以通过在CoroutineContext中添加CoroutineExceptionHandler元素来实现。

    35510

    Android数据流的狂欢:Channel与Flow

    Rouse 读完需要 8 分钟 速读仅需 3 分钟 在 Android 应用程序的开发中,处理异步数据流是一个常见的需求。...当一个协程发送数据到 Channel 时,它会尝试将数据放入队列,如果队列已满,发送协程将被挂起,直到有空间可用。...它是一个惰性的数据流,只有在收集时才会开始执行。当一个协程通过 collect() 函数订阅 Flow 时,它会启动一个新的协程来执行 Flow 的代码块,并将数据推送给订阅者。...使用 Channel 当需要进行协程之间的双向通信,例如生产者-消费者模式,或者需要有界 Channel 来限制数据量时。...在 Android 开发中,通常会同时使用 Channel 和 Flow,根据具体需求选择合适的工具。

    90640

    协程笔记

    协程在Kotlin中文文档的解释是轻量级的线程,Go、Python 等很多现成语言在语言层面上都实现协程,不过Kotlin和他们不同的的是,Kotlin协程本质上只是一套基于原生Java线程池 的封装,...start() } 运行效果如下: image.png 可以看到当设置延迟加载时,协程是start()后才开始执行 说到延迟加载,在总结一下协程启动模式 DEFAULT 模式 默认的 协程启动模式...async 开启的协程为根协程 或 supervisorScope 的直接子协程时,异常在调用 await 时抛出,使用 try catch 可以捕获异常: fun main() = runBlocking...但在 Android 开发中同样不推荐这种用法,因为它的生命周期会只受整个应用程序的生命周期限制,且不能取消。...Android平台协程创建 首先需要引用ktx库 implementation "androidx.lifecycle:lifecycle-runtime-ktx:版本号" 这个时候我们就可以在activity

    1.1K30

    6个Android Kotlin协程相关面试题

    面试题目2:描述Kotlin协程中的runBlocking构建器的作用及其潜在问题。 解答: runBlocking是一个协程构建器,它会立即启动协程并在当前线程阻塞,直到协程执行完成。...这通常用于主函数或测试中,以同步方式执行异步代码。然而,runBlocking在Android中可能会导致主线程阻塞,从而影响UI的响应性,因此应谨慎使用。...当你在一个协程作用域(如lifecycleScope或viewModelScope)中启动多个协程时,这些协程会一起执行,并且当作用域被取消时,所有协程都会被取消。...如果协程块在超时时间内没有完成,它会被取消。 作为Android资深开发专家和面试官,以下是一些关于Kotlin协程的深度面试题及其详细解答: 面试题目6:Kotlin协程与线程有什么区别?...阻塞:线程的阻塞会导致资源浪费,特别是在I/O操作时。 在Android中,可以使用Kotlin协程来处理异步任务,例如网络请求、数据库操作等。

    1.5K10

    【Kotlin 协程】Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )

    通道已关闭[SendChannel.close] * 当协程完成时。 * 当其接收通道为[cancelled][receivecchannel .cancel]时,正在运行的协程将被取消。...* * 此协程中任何未捕获的异常将以此异常作为原因和关闭通道 * 结果通道将变成_failed_,因此此后任何试图从它接收的尝试都会抛出异常。...通道已关闭[SendChannel.close] * 当协程完成时。 * * 协程上下文继承自[CoroutineScope],可以使用[context]参数指定其他上下文元素。...* * 此协程中未捕获的异常将以此异常作为原因和关闭通道 * 结果通道变成_failed_,因此任何发送到该通道的尝试都会抛出异常。...* * **注意:此API将在未来的更新中随着复杂角色的引入而过时 * 参见[issue #87](https://github.com/Kotlin/kotlinx.coroutines/issues

    72210

    Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~

    在 Kotlin 中,协程就是一个封装好的线程框架。类比于 Java 中的 Executor 或 Android 中的 AsyncTask。...确实可以给协程绑定一个名字,而且在协程体中可通过 coroutineContext 协程上下文对象获取到协程上下文的一些信息;协程执行完成时,回调的是 resumeWith 中 Result 的 onSuccess...3.2 协程调度器 在 3.1 中已经出现过调度器的身影,就是当需要指定协程运行的线程时,使用调度器调度即可。在实际的使用中是通过 Dispatchers 对象来访问它们。...如下 code 4 所示,在 Android 的 onCreate 方法中调用 launch 方法,并设置在 Main 线程中执行;然后通过 withContext 方法切换到 IO 线程: // code...水滴技术团队 Android 上的 Kotlin 协程 官方文档 https://developer.android.google.cn/kotlin/coroutines#groovy Kotlin

    1.9K30

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

    但是,我发现了许多开发者在使用协程时会犯一些通用性的错误。 1. 在使用协程时实例化一个新的 Job 实例 有时候你会需要一个 job 来对协程进行一些操作,例如,稍后取消。...这样的话,你就拥有了一个 job 引用,稍后你可以调用它的 .cancel() 方法。...为了保证这一机制正常工作,作用域的 job 和协程的 job 之前的层级结构如下图所示: 在我们的例子中,发生了一些异常情况。...错误的使用 SupervisorJob 有时候你会使用 SupervisorJob 来达到下面的效果: 在 job 继承体系中停止异常向上传播 当一个协程失败时不影响其他的同级协程 由于协程构建器 launch...一些开发者认为当调用协程时,就应该切换到后台调度器,例如,进行网络请求的 Retrofit 的 suspend 函数,进行数据库操作的 Room 的 suspend 函数。 这并不是必须的。

    1.3K20
    领券