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

如果从不可挂起的块调用,Android协程作用域将丢失

。协程是一种轻量级的线程,用于异步编程。它可以在不阻塞主线程的情况下执行耗时操作,并且可以方便地处理并发任务。

在Android中,协程作用域是指协程的生命周期范围。它定义了协程的执行上下文和异常处理方式。协程作用域可以帮助我们管理协程的生命周期,确保协程在适当的时候被取消或完成。

然而,如果从不可挂起的块调用协程,协程作用域将丢失。不可挂起的块是指那些不能被挂起的代码块,例如synchronized块或某些特定的函数。当我们在不可挂起的块中调用协程时,协程将失去其作用域,无法被正确地取消或完成。

为了避免这种情况,我们应该尽量避免在不可挂起的块中调用协程。如果确实需要在不可挂起的块中执行异步操作,可以考虑使用runBlocking函数来创建一个新的协程作用域。runBlocking函数会阻塞当前线程,直到协程执行完成。

另外,为了更好地管理协程的生命周期,可以使用CoroutineScope来创建一个协程作用域,并在需要时手动取消协程。CoroutineScope提供了一些方法来启动和取消协程,例如launch和cancel。

总结起来,如果从不可挂起的块调用协程,协程作用域将丢失。为了避免这种情况,我们应该尽量避免在不可挂起的块中调用协程,并使用runBlocking函数或CoroutineScope来管理协程的生命周期。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

与之前使用 GlobalScope 作用 作用相同 , 执行 lunch 函数 , 后面的代码就是作用 , 在其中执行任务 ; CoroutineScope.launch 函数...是 作用扩展函数 , 其后代码参数就是 作用 , 在其中执行任务 ; public fun CoroutineScope.launch( context: CoroutineContext...是任务调度器 , 执行挂起函数 , 系统会自动分配一个 任务调度器 ; 二、取消 MainScope 作用 ---- 调用 MainScope 作用 cancel 函数 , 即可取...启动任务 , 如果取消 mainScope 作用 , 则在该 作用 中执行 任务 , 都会被取消 ; 挂起函数中途被取消 会抛出 JobCancellationException...作用 CoroutineScope launch 扩展函数 launch { // 作用, 在该代码中执行任务 /

1.1K10

Android 开发中使用 | 上手指南

通常,您应使用 launch 常规函数中启动新。因为常规函数无法调用 await (记住,它无法直接调用 suspend 函数),所以 async 作为主要启动方法没有多大意义。...scope.launch { // 这段代码在作用里启动了一个新 // 它可以调用挂起函数 fetchDocs() } 您可以 launch 看作是代码常规函数送往世界桥梁...在 launch 函数体内,您可以调用 suspend 函数并能够像我们上一篇介绍那样保证主线程安全。 Launch 是代码常规函数送往世界桥梁。...结构化并发保证当一个出错时,它调用方或作用会被通知到。 如果您按照结构化并发规范去编写上述代码,错误就会被正确地抛给调用方处理。...实现这种结构化并发,会为我们代码提供一些保障: 作用取消时,它内部所有的也会被取消; suspend 函数返回时,意味着它所有任务都已完成; 报错时,它所在作用调用方会收到报错通知。

1.4K20

Android7个必要知识点

挂起函数: 掌握挂起函数概念,以及如何在调用和编写挂起函数。学会处理异常和错误。 作用: 理解作用概念,如何管理多个协生命周期和范围。...如果内部抛出异常,它会被传递到调用者处。...下面详细介绍挂起函数概念,以及如何在调用和编写挂起函数,并学会处理异常和错误。...通过掌握挂起函数调用、编写和异常处理,你可以更好地在中处理异步操作,确保代码可靠性和稳定性。 作用 在异步编程中,生命周期和范围管理是至关重要。...launch { // 在作用内启动 // 该继承外部作用上下文和调度器 } 作用嵌套 作用可以嵌套,内部作用会继承外部作用上下文。

45641

Kotlin Android SQLite API 中线程模型

Room 支持后,可以在数据库操作中使用由并发作用、生命周期、嵌套所带来一些便利。...CoroutineContext 一个重要特征是它们被同一作用所继承,比如 withContext 代码作用。...这一机制能够让子继续使用同一个调度器,或在父被取消时,它们会被一起取消。本质上,Room 提供挂起事务 API 会创建一个专门上下文来在同一个事务作用下执行数据库操作。...获取一个事务线程并不是一个阻塞操作,它也不应该是阻塞操作,因为如果没有可用线程的话,应该执行挂起操作,然后通知调用方,避免影响其他执行。...如果在事务作用调用了 DAO 函数,就可以把 DAO 函数重新路由到相应线程中。

1.8K20

再谈程之异常到底怎么办

作用cancel 借助作用管理,我们可以轻松控制该作用所有,一旦取消一个作用,那么这个协作用所有都将被取消。...这就是结构化并发两个特点: 取消一个作用取消该作用所有子 被取消,不会影响其它同级Android开发中,大部分场景下我们不需要考虑cancel,借助...但是fininaly中不能直接调用挂起函数,否则会抛出CancellationException异常,因为它已经被取消了,而你又要在fininaly中执行挂起函数把它挂起,显然与要求矛盾。...然而,如果非要这么做,也不是不可以,当你需要挂起一个被取消,你可以将相应代码包装在withContext(NonCancellable) {}中,并使用withContext函数以及NonCancellable...方法 ❝如果调用Join后再调用cancel,那么将在执行完成后被Cancel,如果先cancel再调用Join,那么执行完成 ❞ 异常处理 当作用域中一个发生异常时,此时异常流程如下所示

66210

【Kotlin 启动 ① ( 构建器 | launch 构建器 | async 构建器 | runBlocking 函数 | Deferred 类 )

---- 1、构建器概念 需要 构建器 来启动 , 构建器 就是 CoroutineScope 作用两个扩展函数 ; 构建器 : 有两种构建器 , 调用 CoroutineScope...作用 的如下两个构建起可启动 ; launch 构建器 : 返回 Job 实例对象 , 该任务没有返回值 ; launch 函数是 CoroutineScope 作用扩展函数...GlobalScope#launch 方法 , 可以启动一个 , 这是顶级 , 其 作用是进程级别的 , 生命周期与应用进程同级 , 即使启动对象被销毁 , 任务也可以继续执行...代码中 , 可以 直接调用 CoroutineScope 扩展方法 , 如 launch , async 函数 ; 3、launch 构建器示例 launch 构建器 直接在 作用 中实现任务...Int 值 ; 返回值直接写在 async 代码最后一行 , 然后调用 Deferred#await() 函数获取该返回值 ; 作用 中返回了 String 字符串类型返回值 , 则调用

43910

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

最佳实践 由于本文所介绍模式是在其它最佳实践基础之上实现,我们可以借此机会回顾一下: 1. 调度器注入到类中 不要在创建调用 withContext 时硬编码调度器。...而如果您想要将程限定在其他作用,请继续阅读,接下来本文将对此进行讨论。...我们想要此操作运行时长超过 viewModelScope,这个目的要如何达成呢? 我们需要在 Application 类中创建自己作用,并在由它启动调用这些操作。...当所需生存期比调用作用生存期更长时,我们可以使用 applicationScope 来运行。...每当您需要执行一些超出当前作用范围工作时,我们都建议您在您自己 Application 类中创建一个自定义作用,并在此作用域中执行

1.4K20

Kotlin知识累计

2.这里有别于一个内创建多个子挂起单个子挂起了会去执行其他子,务必不要搞混了。withContext挂起是内部包裹代码,阻塞当前运行withContext。...async默认是等待状态,创建后不会立即执行会有延迟,但是如果调用.await()方法会立即执行并且是阻塞父如果设置了启动模式async(start = CoroutineStart.LAZY...大写CoroutineScope与小写coroutineScope区别:小写coroutineScope叫做构建器,里面自带继承父上下文作用,而大写作用是自定义设置上下文作用...源码可知folw内是执行了挂起函数,flow是库,只能用于环境。...// 只有collect时才会调用发送流生产数据 //下游接收不可以设置运行线程,保持与父相同运行线程 } } 7、Channel通道:本质上来看,计算机上线程和协同步信息其实都是通过共享内存来进行

16510

即学即用Kotlin -

在这一次分享中,发现 Flow 和 Channel 这一儿知识是自己不怎么了解,本文也着重和大家聊一聊这一内容,部分分为三篇,本文是第一篇: “《即学即用Kotlin - 》 《抽丝剥茧...作用 作用有三种,他们分别是: runBlocking:顶层函数,它和 coroutineScope 不一样,它会阻塞当前线程来等待,所以这个方法在业务中并不适用 。...GlobalScope:全局作用,可以在整个应用声明周期中操作,且不能取消,所以仍不适用于业务开发。 自定义作用:自定义作用,不会造成内存泄漏。...launch launch 作用名称就可以看出来,启动一个新,它返回是一个 Job对象,我们可以调用 Job#cancel() 取消这个协。...) return num * num } 结合 Android Jetpack 在介绍自定义作用时候,我们需要主动在 Activity 或者 Fragment 中 onDestroy

1.5K20

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

, 大量临时数据会丢失 , 因此在中 , 无法直接取消 CPU 密集型任务 , 这是对保护措施 ; CPU 密集型任务取消示例 : 在下面的 任务 中 , 循环 10000000...; 如果 调用了 Job#cancel 函数 取消协 , 此时 isActive 值肯定为 false , 这里在 CPU 密集型任务 执行时 , 时刻调用 isActive 判定当前状态即可...:23.680 I 退出作用 四、使用 yield 函数检查状态并处理取消操作 ---- 在中 , 可以使用 yield() 函数 , 检查当前状态 , 如果已经调用 cancel...执行权让给别的执行 ; yield() 函数 会在每次循环时 , 都执行一次 , 每次循环时都执行该函数时候 , 此时会尝试出让线程执行权 , 看看是否有其它更紧急需要执行 , 如果有...* * 这个暂停功能是可以取消。 * 如果调用挂起函数时取消或完成当前[Job] * 这个函数正在等待调度,它会以[CancellationException]恢复。

1K20

设计 repeatOnLifecycle API 背后故事

借此,所有已经属于 LifecycleOwner 作用代码都可以省略显式接收器。 repeatOnLifecycle 是一个挂起函数 。就其本身而言,它需要在中执行。...repeatOnLifecycle会将调用挂起,然后每当生命周期进入 (或高于) 目标状态时在一个新中执行您作为参数传入一个挂起。...如果生命周期低于目标状态,因执行该代码而启动就会被取消。最后,repeatOnLifecycle 函数直到在生命周期处于 DESTROYED 状态时才会继续调用。...它也可以帮助您考虑清楚您想要这个重复执行代码在哪一个作用执行。此 API 一目了然,并且符合开发者们期望: 同其他挂起函数一样,它会将当前执行中断,直到特定事件发生。...: 它不管调用作用,并且在用于其他内部时有潜在危险。

79010

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

函数构造超时取消任务 一、释放资源 ---- 如果 中途取消 , 期间需要 释放占有的资源 ; 如果执行任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用...---- 如果在 finally 中需要使用 suspend 挂起函数 , 则 挂起函数以及之后代码将不会被执行 ; 如下代码 : val job1 = coroutineScope.launch...(1000) Log.i(TAG, "释放占用资源完毕") } } 如果取消后 , finally 代码代码肯定会执行 , 但是如果 finally 中 delay...挂起函数以及之后代码将不会被执行 ; 使用 withContext(NonCancellable) {} 代码 , 可以构造一个无法取消任务 , 这样可以避免 finally 中代码无法完全执行...23:12:32.093 I 退出作用 四、使用 withTimeoutOrNull 函数构造超时取消任务 ---- 使用 withTimeout 函数 , 可以构造超时取消任务

1.3K10

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

Android 应用开发中,异步编程是不可避免,而 Kotlin Flow 是一个强大库,能够使异步操作更加优雅和易于管理。...允许在函数执行过程中挂起,等待某些条件满足后恢复执行。Flow 利用了这一特性来实现数据流处理。 在 Flow 内部,数据流被建模为一系列悬挂函数调用。...而订阅者在收集数据时会挂起,并等待数据传递。这样,通过挂起和恢复机制,Flow 实现了数据异步传递和处理。 此外,Flow 还支持冷流特性。只有在有订阅者时,发射器才会开始执行。...使用作用 在 Flow 中进行取消操作时,建议使用作用来确保操作一致性。通过 coroutineScope 函数,你可以创建一个作用,然后在作用内启动 Flow 操作。...集成 Kotlin Flow 是 Kotlin 一部分,因此它天生与 Kotlin 无缝集成。这意味着你可以在同一个代码中使用和 Flow,实现更加一致和清晰异步编程。

76730

使用和 Flow 简化 API 设计

另外,如果您是 API 使用者,则可能愿意第三方 API 界面适配,以使它们对 Kotlin 更友好。...(): Location 由于这是一个一次性异步操作,我们使用 suspendCancellableCoroutine 函数: 一个用于库创建挂起函数底层构建。...这里会挂起 //直到某个回调调用了 continuation 参数 } 注意: 尽管库中同样包含了不可取消版本构建器 (即 suspendCoroutine),但最好始终选择使用...suspendCancellableCoroutine 处理作用取消及底层 API 传播取消事件。...如果该 lambda 返回了结果,则立即恢复;否则将会在 CancellableContinuation 被 lambda 手动恢复前保持挂起状态。

1.6K20

在 View 上使用挂起函数

使用解决问题 这里假定您已经对有一定理解,如果接下来内容对您来说会有些陌生,可以通过我们今年早期系列文章进行回顾: 在 Android 开发中使用 | 背景介绍。...如果某个 view 它所在层级中被移除,那么根据所处作用 (scope),它有可能会被取消。...作用 不知道您有没有发现这样一个问题,在上面的例子中,我们使用了 lifecycleScope 来启动,为什么要这样做呢?...为了避免发生内存泄漏,在我们操作 UI 时候,选择合适作用来运行是极其重要。幸运是,我们 View 有一些范围合适 Lifecycle。...我们通过 onAnimationCancel() 回调来监听动画被取消事件,通过调用 cancel() 方法来取消挂起。 这就是使用挂起函数等待方法执行来封装回调基本使用了。

2.3K30

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

如果Deferred不执行await()则async内部抛出异常不会被logCat或try Catch捕获,但是依然会导致作用取消和异常崩溃; 但当执行await时异常信息会重新抛出 如果async...启动需要作用,但是作用又是在创建过程中产生。 图片 官方提供常用作用: runBlocking: 顶层函数,可启动,但会阻塞当前线程 GlobalScope 全局作用。...在指定上运行挂起代码,放在该任何代码都始终通过IO调度器执行,并挂起直至代码运行完成。...【suspend】:挂起或暂停,用于挂起执行当前,并保存所有局部变量 【resume】:恢复,用于让已挂起挂起处恢复继续执行 挂起(暂停)时,会复制并保存当前堆栈帧以供稍后使用,信息保存到...= invokeSuspend(param) //如果代码内执行了挂起方法,挂起,resumeWith执行结束,再次调用resumeWith时挂起点之后代码才能继续执行

1.7K40

写给Android工程师指南

内存泄漏更少:使用结构化并发机制在一个作用内执行多项操作。 内置取消支持:取消操作会自动在运行中整个协层次结构内传播。...Jetpack 集成:许多 Jetpack 库都包含提供全面支持扩展。某些库还提供自己作用,可供您用于结构化并发。...具体来说,在被挂起时,会将当前执行状态保存到一个回调函数(即挂起函数 Continuation)中,然后控制权交回给调用方。当准备好恢复时,它会回调函数中取回执行状态,继续执行。...yield()时,该方法就会判断当前作用是否已经不在活跃,如果满足条件,则直接抛出 CancellationException 异常。...注意:这里我们锁是 this@coroutineScope ,而不是 this ,前者代表着我们循环外作用对象,而直接使用this则代表了当前作用对象,并不存在竞争关系。

1.3K40

【Kotlin 启动 ⑤ ( 作用构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

runBlocking 可以在普通函数中执行 , 主线程包装成了体 ; 但是 coroutineScope 函数 由于是 挂起函数 , 只能在 体 中使用 ; 该 coroutineScope...( coroutineScope 函数 | supervisorScope 函数 ) ---- 1、作用构建器概念 coroutineScope 函数 构建 作用 , 如果有一个 子....() -> R): R supervisorScope 函数 构建 作用 , 如果有一个 子 执行失败 , 其它子继续执行 , 不会受到执行失败影响 ; 函数原型如下 : public...// coroutineScope 函数 构建 作用 , // 如果有一个 子 执行失败 , 则其它 所有的子会被取消 ;...构建 作用 , // 如果有一个 子 执行失败 , // 其它子继续执行 , 不会受到执行失败影响 ;

47130

Kotlin 看这一篇就够了

首先,对于一个耗时操作,我们需要将他切换到后台线程执行,withContext函数可以构建一个作用,他必须在挂起函数或者中执行,suspend关键字是kotlin为我们提供 用于标记挂起函数关键字...这样,本来要分步做两件事情可以同时做了,当然可以提高效率了,async函数必须在作用域中调用,会创建一个新,并返回一个Deferred对象,调用这个对象await方法 就可以获取执行结果...创建作用代码没有执行完毕前会一直阻塞线程,所以上面。...coroutineScope函数是一个挂起函数,它会继承外部作用并创建一个子,只能在作用或者挂起函数中调用 launch函数必须在作用域中才能调用。...,可以按照上面的方法使用了 如果在页面打开时候,我们在中进行网络请求,当页面销毁时候我们也要将任务取消以免造成不必要问题 如何取消协任务 coroutineScope 直接调用cancle

1.5K10
领券